我使用Sqflite保存数据(例如人名)。通过这个函数,我获得了DB的数据:
Future<List<Student>> getStudentList() async {
await openDb();
final List<Map<String, dynamic>> maps = await _database.query('student', orderBy: 'name ASC');
return List.generate(maps.length, (i) {
return Student(
id: maps[i]['id'], name: maps[i]['name']);
});
}在开始时,我希望将DB中的名称添加到列表中。
@override
void initState() {
foo();
//userList.add(User('Test1', 'Test, false));
//userList.add(User('test2', 'test', false));
userList
.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
filterList();
searchController.addListener(() {
filterList();
});
super.initState();
}我就是这样定义foo()的,我想从DB中获取数据:
Future foo() async{
studlist = await dbmanager.getStudentList();
var tl = studlist.length;
for (var i = 0; i < tl; i++) {
userList.add(User(studlist[i].name, 'Test', false));
// print('${studlist[i].name}');
// print('$i');
}
}问题是,这个函数没有保存列表中的任何内容。如果我在void initState()中使用这个测试代码而不是foo(),它可以工作:
userList.add(User('Test1', 'Test, false));
userList.add(User('test2', 'test', false));所以foo()一定有问题。我还在for循环中添加了print('${studlist[i].name}'); print('$i');,以测试studlist[i]是否有效,并打印出每个名称。
谢谢你的帮忙!
发布于 2020-02-17 16:53:08
问题是您的foo方法是异步的,您没有等待它。因此,initState调用代码在等待被击中时和在userList添加之前立即返回。添加将最终发生,但您的initState逻辑在此之前正在运行。要使其工作,您需要等到foo完成。您不能只是去做initState异步并等待foo,但是您可以在Future完成之后使用then方法完成您的工作。
void initState() {
foo().then((result) {
userList
.sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
filterList();
searchController.addListener(() {
filterList();
});
setState(() => {});
});
super.initState();
}现在,您的build需要处理还没有用户的加载情况,但是这段代码应该填充您的userList并使用用户重新构建您的视图。如果这变得更加复杂,您可能需要考虑使用StreamBuilder来处理这个异步行为。
https://stackoverflow.com/questions/60264893
复制相似问题