Asynchronous 我如何等待一个变量
是否可以使用Asynchronous 我如何等待一个变量,asynchronous,flutter,dart,async-await,reactive-programming,Asynchronous,Flutter,Dart,Async Await,Reactive Programming,是否可以使用未来来等待Dart中简单变量值的更改 在我的例子中,我有一个单例方法,它在第一次调用时创建并打开一个数据库。这个方法是从我的应用程序中的多个地方调用的,我需要一种方法让第二次、第三次等调用等待第一次调用创建并打开数据库 class DB{ static Database _db; static Future<Database> instance() async { if( _db == null ){ print(
未来
来等待
Dart中简单变量值的更改
在我的例子中,我有一个单例方法,它在第一次调用时创建并打开一个数据库。这个方法是从我的应用程序中的多个地方调用的,我需要一种方法让第二次、第三次等调用等待第一次调用创建并打开数据库
class DB{
static Database _db;
static Future<Database> instance() async {
if( _db == null ){
print('Creating/opening database');
_db = await createOrOpenDatabase();
}
return _db;
}
}
// Somewhere in the app
await DB.instance().doSomething();
// Meanwhile, somewhere else in the app
await DB.instance().doSomethingElse();
解决此问题的一种方法是添加一些变量,指示当前正在创建和/或打开数据库:
class DB{
static Database _db;
static bool _openingDb;
static Database instance() async {
if( _openingDb )
// Wait until _openingDb becomes false
if( _db == null ){
_openingDb = true;
print('Creating/opening database');
_db = await createOrOpenDatabase();
_openingDb = false;
}
return _db;
}
}
但是我该如何等待
\u openingDb
的值改变呢?似乎我在这里遗漏了一些明显的东西…我发现我可以使用a来完成我想要的
class DB {
static Database _db;
static Completer _dbOpenCompleter;
static Future<Database> instance() async {
if( _dbOpenCompleter != null && !_dbOpenCompleter.isCompleted ) {
print('Awaiting database creation');
await _dbOpenCompleter.future;
}
if( _db == null ) {
_dbOpenCompleter = Completer();
try {
print('Creating/opening database');
_db = await openOrCreateDatabase();
}
finally{
_dbOpenCompleter.complete();
}
}
return _db;
}
}
class DB {
static Database _db;
static Completer _dbOpenCompleter;
static Future<Database> instance() async {
if( _dbOpenCompleter != null && !_dbOpenCompleter.isCompleted ) {
print('Awaiting database creation');
await _dbOpenCompleter.future;
}
if( _db == null ) {
_dbOpenCompleter = Completer();
try {
print('Creating/opening database');
_db = await openOrCreateDatabase();
}
finally{
_dbOpenCompleter.complete();
}
}
return _db;
}
}
Creating/opening database
Awaiting database creation