在 flutter 中执行异步代码时出现问题
Problem when executing an asynchronous code in flutter
谁能帮我看看 async
和 await
是如何工作的?程序在调用 rawQuery(...)
时抱怨 db
是 null
。我的理解是 await
之后的下一个语句不会在带有 await
的函数尚未完成时执行,但是 async
函数之后的语句不会等待该函数执行完成它的工作。例如:
var db;
Widget build(BuildContext context) {
...
List<Map<String, Object>> resultSet;
asyncFunction();
db.rawQuery(...).then((value) => resultSet = value);
return Scaffold(
appBar: AppBar(...),
child: Text()
);
}
void asyncFunction() async {
String dbPath = await getDatabasesPath();
String path = join(dbPath, 'sample.db');
db = await openDatabase(path);
}
db
是 db.rawQuery(...)
中的 null
。 (我希望你明白我的意思)。我不知道是否可以将 return Scaffold()
放在 then(...)
中,或者 Widget build() {...}
是否可以等到所有数据都准备好。
编辑:抱歉,我没有注意到您正在使用小部件的构建方法。
首先,如果您在此处调用您的数据库,您将在每次 重新构建小部件时调用您的数据库。这不是一个好习惯。您需要在其他地方实例化您的数据库(例如在服务中)。加载数据后,您可以在此处调用它。
其次,如果你想显示来自 Future 的数据。正如@jamesdlin 所说,您需要使用 FutureBuilder。
谁能帮我看看 async
和 await
是如何工作的?程序在调用 rawQuery(...)
时抱怨 db
是 null
。我的理解是 await
之后的下一个语句不会在带有 await
的函数尚未完成时执行,但是 async
函数之后的语句不会等待该函数执行完成它的工作。例如:
var db;
Widget build(BuildContext context) {
...
List<Map<String, Object>> resultSet;
asyncFunction();
db.rawQuery(...).then((value) => resultSet = value);
return Scaffold(
appBar: AppBar(...),
child: Text()
);
}
void asyncFunction() async {
String dbPath = await getDatabasesPath();
String path = join(dbPath, 'sample.db');
db = await openDatabase(path);
}
db
是 db.rawQuery(...)
中的 null
。 (我希望你明白我的意思)。我不知道是否可以将 return Scaffold()
放在 then(...)
中,或者 Widget build() {...}
是否可以等到所有数据都准备好。
编辑:抱歉,我没有注意到您正在使用小部件的构建方法。
首先,如果您在此处调用您的数据库,您将在每次 重新构建小部件时调用您的数据库。这不是一个好习惯。您需要在其他地方实例化您的数据库(例如在服务中)。加载数据后,您可以在此处调用它。
其次,如果你想显示来自 Future 的数据。正如@jamesdlin 所说,您需要使用 FutureBuilder。