Flutter筆記3:Dart的單例模式與異步

想要在數(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)雅的解決方式。不知道是否有更好的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容