Sqlite 如何使用异步方法构建列表对象?
我收到一个错误,该错误表示.length方法正在调用null对象\u genreList 我使用异步方法从本地资产sqlite数据库获取数据,该数据库是一个流派列表。然后我使用ListView.builder在屏幕上显示该列表。这是获取数据的代码Sqlite 如何使用异步方法构建列表对象?,sqlite,asynchronous,dart,flutter,Sqlite,Asynchronous,Dart,Flutter,我收到一个错误,该错误表示.length方法正在调用null对象\u genreList 我使用异步方法从本地资产sqlite数据库获取数据,该数据库是一个流派列表。然后我使用ListView.builder在屏幕上显示该列表。这是获取数据的代码 Future getGenreData() async { Directory documentsDirectory = await getApplicationDocumentsDirectory(); String path =
Future getGenreData() async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "asset_sample_sqlite.db");
ByteData data = await rootBundle.load(join("assets", "sample_sqlite.db"));
List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await new File(path).writeAsBytes(bytes);
Database db = await openDatabase(path);
_genreList = await db.rawQuery('SELECT genre_name[] FROM tbl_genres');
print(_genreList);
await db.close();
}
这里的最终目标是显示一个类型列表(来自我的sqlite数据库中的tbl_类型),它能够将数据传递到下一页以显示一个书籍列表(来自我的sqlite数据库中的tbl_书籍)与该类型相关。异步编程的全部要点是,当您在后台执行耗时的工作时,您的用户界面可以保持活动状态。因此,在加载应用程序时,您需要(并且希望)显示类似于a甚至空白页(例如a)的内容 至少有两种方法可以做到这一点:
加载
,当您的数据(在另一个字段中)准备就绪时,您将该字段初始化为真
,并设置为假
。您的代码如下所示:导入“包装:颤振/材料.省道”;
类GenresPage扩展StatefulWidget{
@凌驾
_GenresPageState createState()=>\u GenresPageState();
}
类_GenresPageState扩展状态{
布尔加载;
重新命名列表;
@凌驾
void initState(){
super.initState();
加载=真;
getGenreData();
}
未来getGenreData()异步{
final genreData=等待实际的GetthoseNames();
设置状态(){
genreNames=genreData;
加载=假;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:!正在加载?新建ListView.builder(
itemCount:genreNames.length,
itemBuilder:(上下文,索引){
归还新卡(
孩子:新的ListTile(
标题:新文本(${genreNames[index]}),
),
);
},
):CircularProgressIndicator(),//或Container()
);
}
}
getGenreData
方法,以将列表作为未来的
返回李>
非常感谢你,这帮了大忙。
@override
Widget build(BuildContext context) {
return Scaffold(
body: new ListView.builder(
itemCount: _genreList.length, //need to access the genreList here
itemBuilder: (BuildContext context, int index) {
return new Card(
child: new ListTile(
title: new Text("${_genreList[index]}"),
onTap: () {
Navigator.push(context,
MaterialPageRoute(
builder: (context) => BookPage(id: index),
),
);
}
),
);
}
),
);
}