我想初始化一個私有的 SharedPreferences 欄位,似乎是使用建構式的好地方。但是只要SharedPreferences.getInstance()回傳一個 Future 編譯器就不能使用 await 因為The await expression can only be used in an async function.. 否則不可能將建構式主體設為異步。那么如何制作呢?
GetIt getIt = GetIt.instance;
void setupLocator() {
getIt.registerSingleton<LocalStorageService>(LocalStorageService());
}
class LocalStorageService {
SharedPreferences _prefs;
LocalStorageService() : _prefs = await SharedPreferences.getInstance(); //error
...
}
可以創建一個額外的函式來呼叫setupLocator()并創建它async,然后在 main() 方法中使用它等待結果并將 SharedPreferences 的實體LocalStorageService作為引數傳遞到構造函式中,但我更喜歡在LocalStorageService類中初始化它。
uj5u.com熱心網友回復:
既然你正在使用GetIt,我建議你使用registerSingletonAsync方法
await getIt.registerSingletonAsync<LocalStorageService>(() async {
final pref = await SharedPreferences.getInstance();
return LocalStorageService(pref);
});
我個人不喜歡在建構式中創建它,因為可能另一個類依賴于它,并且在構造之前它會得到一個空變數,這會導致問題。
考慮到您也可以SharedPreferences在記憶體中注冊并創建LocalStorageService這樣的
await getIt.registerSingletonAsync<SharedPreferences>(() async {
return SharedPreferences.getInstance();
});
getIt.registerSinglenton<LocalStorageService>(
() => LocalStorageService(prefs: getIt()),
);
uj5u.com熱心網友回復:
你應該檢查這個問題: Calling an async method from component constructor in Dart
我認為你可以做這樣的事情 - 只要記住你的 _prefs 在物件創建后不會立即可用。
GetIt getIt = GetIt.instance;
void setupLocator() {
getIt.registerSingleton<LocalStorageService>(LocalStorageService());
}
class LocalStorageService {
SharedPreferences _prefs;
LocalStorageService() : SharedPreferences.getInstance().then((prefs) => _prefs=prefs);
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374031.html
