语境
我有主要方法:
void main() {
setupBeforeRun(); // <--- this is important
runApp(const App());
}
void setupBeforeRun() {
DependencyInjection.configure(); // <--- here I set up DB object
DependencyInjection.get<DictionaryService>().getDictionaries(); // <-- here I am using it
}
我DependencyInjection
只是创建Storage
实例:
class StorageService {
late Database _db;
StorageService() {
var future = initDb().then((value) => _db = value);
}
Future<Database> initDb() async {
if (Platform.isWindows || Platform.isLinux) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
return openDatabase(
join(await getDatabasesPath(), 'my.db'),
onCreate: (db, version) => _createTables(db, version),
version: 1,
);
}
挑战
我想停止我的应用程序直到_db
正确初始化。否则我会随机收到错误Field '_db@24081564 has not been initialized
。我async
在这里使用openDatabase
是因为async
.
什么不起作用
bool isNotComplited = true
var future = initDb().then((value) => _db = value).whenComplited(isNotComplited = false);
while(isNotComplited){}
它只是挂起所有应用程序,未来永远不会完成。
问题
如何等待 future 完成然后继续?我不关心等待的延迟,初始化的数据库对我来说更重要。上面的代码只是一个例子。我想知道 如何停止并等待未来在同步函数中完成?
StorageService
我建议您使用registerLazySingletonAsync注册。为此,您必须创建一个异步方法,该方法返回您的StorageService
.现在您可以使用 GetIt 注册您的服务。
然后,您可以通过执行以下操作来检索 StorageService: