想要在數(shù)據(jù)庫(kù)工具類(lèi)中使用單例模式。使用Dart的工廠構(gòu)造函數(shù)可以實(shí)現(xiàn)。
DbHelper._internal() {
createDb();//初始化數(shù)據(jù)庫(kù)
}
static final _instance = DbHelper._internal();
factory DbHelper(){
return _instance;
}
這里還使用了命名構(gòu)造函數(shù),在函數(shù)體內(nèi)初始化了數(shù)據(jù)庫(kù)揍拆。但是初始化數(shù)據(jù)庫(kù)的操作是異步的,這樣可能會(huì)導(dǎo)致空指針錯(cuò)誤茶凳。
dbHelper = DbHelper();//獲取數(shù)據(jù)庫(kù)句柄
dbHelper.getData();//獲取數(shù)據(jù)庫(kù)數(shù)據(jù)嫂拴,報(bào)錯(cuò)空指針
Dart的構(gòu)造方法又不支持異步。
factory DbHelper() async{ //報(bào)錯(cuò)Factory bodies can't use 'async', 'async*', or 'sync*'.
return _instance;
}
不能使用await async贮喧,那么如何實(shí)現(xiàn)異步邏輯筒狠?
暫時(shí)沒(méi)找到特別完美的辦法,但能勉強(qiáng)實(shí)現(xiàn)功能箱沦。
參考:https://stackoverflow.com/questions/38933801/calling-an-async-method-from-component-constructor-in-dart
修改工具類(lèi)
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;
在調(diào)用時(shí):
dbHelper = DbHelper();
await dbHelper.initializationDone;
dbHelper.getData();
中間加一句await dbHelper.initializationDone;
辩恼,這樣程序會(huì)等待initializationDone
執(zhí)行完,initializationDone
有會(huì)等待_database
初始化完谓形,也就是數(shù)據(jù)庫(kù)初始化完畢灶伊,才會(huì)向下執(zhí)行獲取數(shù)據(jù)方法。
這樣實(shí)現(xiàn)了表面上的順序操作寒跳,不過(guò)在調(diào)用時(shí)也多了一行代碼聘萨,應(yīng)該不是最優(yōu)雅的解決方式。不知道是否有更好的方法童太。