Flutter笔记3:Dart的单例模式与异步

想要在数据库工具类中使用单例模式。使用Dart的工厂构造函数可以实现。

  DbHelper._internal() {
    createDb();//初始化数据库
  }

  static final _instance = DbHelper._internal();

  factory DbHelper(){
    return _instance;
  }

这里还使用了命名构造函数,在函数体内初始化了数据库。但是初始化数据库的操作是异步的,这样可能会导致空指针错误。

dbHelper = DbHelper();//获取数据库句柄
dbHelper.getData();//获取数据库数据,报错空指针

Dart的构造方法又不支持异步。

  factory DbHelper() async{ //报错Factory bodies can't use 'async', 'async*', or 'sync*'.
    return _instance;
  }

不能使用await async,那么如何实现异步逻辑?

暂时没找到特别完美的办法,但能勉强实现功能。
参考:https://stackoverflow.com/questions/38933801/calling-an-async-method-from-component-constructor-in-dart

修改工具类

class DbHelper{
  late final Future _database;

  DbHelper._internal() {
      _database = createDb();
  }

  static final _instance = DbHelper._internal();

  factory DbHelper(){
    return _instance;
  }

  Future get initializationDone => _database;
}

增加了两句代码
late final Future _database;
Future get initializationDone => _database;
在调用时:

dbHelper = DbHelper();
await dbHelper.initializationDone;
dbHelper.getData();

中间加一句await dbHelper.initializationDone;,这样程序会等待initializationDone执行完,initializationDone有会等待_database初始化完,也就是数据库初始化完毕,才会向下执行获取数据方法。

这样实现了表面上的顺序操作,不过在调用时也多了一行代码,应该不是最优雅的解决方式。不知道是否有更好的方法。

你可能感兴趣的:(Flutter笔记3:Dart的单例模式与异步)