颤振未来 & Sqflite
Flutter Future & 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()
一定有问题。
我还在 for 循环中添加了 print('${studlist[i].name}'); print('$i');
来测试,如果 studlist[i]
有效,它会打印出每个名字。
感谢您的帮助!
问题是您的 foo
方法是异步的,您没有等待它。因此,一旦等待被点击并且在您的 userList
添加之前,initState
调用代码就会返回。添加最终会发生,但在此之前你的逻辑是 initState
运行。为此,您需要等到 foo
完成。您不能只是让 initState
异步并等待 foo
,但您可以在 Future
完成后使用 then 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,这是处理这种异步行为的更多设置。
我使用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()
一定有问题。
我还在 for 循环中添加了 print('${studlist[i].name}'); print('$i');
来测试,如果 studlist[i]
有效,它会打印出每个名字。
感谢您的帮助!
问题是您的 foo
方法是异步的,您没有等待它。因此,一旦等待被点击并且在您的 userList
添加之前,initState
调用代码就会返回。添加最终会发生,但在此之前你的逻辑是 initState
运行。为此,您需要等到 foo
完成。您不能只是让 initState
异步并等待 foo
,但您可以在 Future
完成后使用 then 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,这是处理这种异步行为的更多设置。