flutter - 颤振未来和 Sqflite
问题描述
我使用 Sqflite 来保存数据(例如人名)。使用这个函数,我得到了数据库的数据:
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']);
});
}
一开始我想将数据库中的名称添加到列表中。
@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() 的方式,我想从数据库中获取数据:
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()
。我还在 print('${studlist[i].name}'); print('$i');
for 循环中添加了测试,如果studlist[i]
有效,它会打印出每个名称。
谢谢你的帮助!
解决方案
问题是你的foo
方法是异步的,你没有在等待它。因此,initState
一旦等待被命中并且在您userList
添加之前,调用代码就会返回。添加最终会发生,但在此之前您的initState
逻辑正在运行。为此,您需要等到foo
完成。你不能只做initState
async 和 await foo
,但是你可以在Future
完成后使用 thenthen
方法来完成你的工作。
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,它是用于处理这种异步行为的更多设置。
推荐阅读
- datetime - 如何修复本地时间的 Google Apps 脚本并自动清除单元格
- apache - WIX + LAMP 一个域下
- python-3.x - 将多个值读入 pandas DataFrame
- r - 根据data.table R中组内不同列中的后续值选择值
- php - 如何使用 PHP 以盒子样式显示 MySQL 查询结果?
- android - 错误:Ionic CLI 将退出。请检查上面的任何输出以获取错误详细信息
- sqlbulkcopy - c# - 给定的 ColumnName 'xxxxxxx' 与数据源中的任何列都不匹配
- javascript - 如何在 devtools 的 JavaScript 堆快照中获取对象的路径?
- python - 按 bs4 标签拆分/获取两个标签之间的文本
- r - R中的多元回归