想要在數(shù)據(jù)庫(kù)工具類中使用單例模式。使用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í)沒找到特別完美的辦法,但能勉強(qiáng)實(shí)現(xiàn)功能。
參考: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;
在調(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)了表面上的順序操作,不過在調(diào)用時(shí)也多了一行代碼,應(yīng)該不是最優(yōu)雅的解決方式。不知道是否有更好的方法。