我希望将
shared_preferences
与 riverpod
一起使用。我是一名 Riverpod 新手,以前从未使用过 Shared_Preferences,因此我正在寻找有关如何将两者结合起来的指南/示例。我确实看到了这个,但那是使用过时的SharedPreferences
而不是SharedPreferencesWithCache
或SharedPreferencesAsync
。
以下是我想出的 3 种方法(以我有限的知识):
final sharedPreferencesProvider = Provider((ref)=>SharedPreferencesAsync());
或
final sharedPreferencesProvider = FutureProvider<SharedPreferences>((ref) async {
final prefs = await SharedPreferences.getInstance();
return prefs;
});
或
final sharedPreferencesProvider =
FutureProvider<SharedPreferencesWithCache>((ref) async {
final prefs = await SharedPreferencesWithCache.create(
cacheOptions: const SharedPreferencesWithCacheOptions(allowList: null));
return prefs;
});
我不确定该使用哪一个。另外,让 withCache 变体的提供者成为 FutureProvider 感觉很奇怪。这意味着我必须经历所有这些 AsyncValue 麻烦(见下文),而 SharedPreferencesWithCache 则不必处理这个问题,因为由于它被缓存,您应该能够同步调用它。也许不将其放在 FutureProvider 中,而是将其放在全局变量中?但问题来了:我该把这个全局变量放在哪里?
Text(ref.watch(sharedPreferencesProvider).asData!.value.getString("my_key")!);
我还想在原始
prefs
周围有某种包装器,这似乎比连续调用 setString
等更强大一些。不过不确定我如何将该类集成到所有这些中......也许有些东西就像之前链接的例子一样?
您可以使用 Riverpod 的注释来简化此过程,它将自动为您生成必要的提供程序,因此您无需担心提供程序类型。以下是如何将其与 SharedPreferences 一起使用的示例:
// A FutureProvider for accessing SharedPreferences asynchronously
@Riverpod(keepAlive: true)
Future<SharedPreferences> sharedPreferences(SharedPreferencesRef ref) =>
SharedPreferences.getInstance();
通过这种方法,您可以保持代码干净,并且提供程序将自动为您处理异步部分。由于 keepAlive 选项,它还支持缓存。
您可以这样访问首选项:
final prefs = ref.watch(sharedPreferencesProvider).asData?.value;
final myValue = prefs?.getString("my_key");
有关使用 Riverpod 进行稳健应用程序初始化的更多信息,您可以查看这篇有用的文章: 使用 Riverpod 进行稳健的应用程序初始化