想要在数据库工具类中使用单例模式。使用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> _database;
DbHelper._internal() {
_database = createDb();
}
static final _instance = DbHelper._internal();
factory DbHelper(){
return _instance;
}
Future get initializationDone => _database;
}
增加了两句代码
late final Future<Database> _database;
Future get initializationDone => _database;
在调用时:
dbHelper = DbHelper();
await dbHelper.initializationDone;
dbHelper.getData();
中间加一句await dbHelper.initializationDone;
,这样程序会等待initializationDone
执行完,initializationDone
有会等待_database
初始化完,也就是数据库初始化完毕,才会向下执行获取数据方法。
这样实现了表面上的顺序操作,不过在调用时也多了一行代码,应该不是最优雅的解决方式。不知道是否有更好的方法。
网友评论