我正在為我的應用程式使用 shared_preferences 并且我已經使用輔助方法創建了一個設定類。作為設定方法的一部分,我使用 Settings.create 來生成我的 SharedPreferences。它看起來像這樣:
class Settings extends ChangeNotifier {
final SharedPreferences prefs;
Settings(this.prefs);
static Future<Settings> create() async {
var prefs = await SharedPreferences.getInstance();
return Settings(prefs);
}
// ### Helper Methods ###
}
我已經使用這篇文章嘗試了一個解決方案并提出了這個:
FutureProvider<Settings> createSettings = FutureProvider<Settings>((ref) {
return Settings.create();
});
ChangeNotifierProvider<Settings> settingsProvider = ChangeNotifierProvider<Settings> ((ref) {
final settingsInstance = ref.watch(createSettings).maybeWhen(
data: (value) => value,
orElse: () => null,
);
return Settings(settingsInstance.prefs);
});
我現在遇到的問題是我得到一個錯誤,因為只要未來還沒有完成,就會回傳 null 。
我碰壁了,我沒有想法。有誰知道如何解決這個問題?
uj5u.com熱心網友回復:
是的,有兩個選擇。取決于您想要做出的權衡。
選項
選項1(等待)
在函式main.dart
內部Future<void> main() async {}
,只需等待呼叫獲取共享首選項,然后在您的提供程式中手動設定狀態(使用狀態提供程式)。
所以看起來像:
(providers.dart)
final settingsProvider = StateProvider<Settings>((_) => defaultValue);
// ^ You can also make the above nullable if you don't have a reasonable default. But to be fair, this default will never be called if you're always setting it in main.
(main.dart)
Future<void> main() async {
final settings = await Settings.create();
final container = ProviderContainer();
container.read(settingsProvider.state).state = settings;
}
選項2(同樣的想法,只是不要等待)
與上面的代碼相同,但不要在 main 中等待。只是不要等待。區別如下:
(main.dart)
Future<void> main() async {
final container = ProviderContainer();
Settings.create().then((settings){
container.read(settingsProvider.state).state = settings;
});
// The rest of your code...
runApp();
}
概述/比較
選項 #1 更易于使用,但如果您想要快速啟動,您可能無法等待。但我懷疑這是否重要。在這種情況下,如果您有合理的默認值,請使用選項 #2
有關在 main() 中使用 Riverpod 的代碼,請參考此 Github 問題評論: https ://github.com/rrousselGit/riverpod/issues/202#issuecomment-731585273
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486638.html
上一篇:Firebase參考
下一篇:顫振中的格式例外