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