RiverPod - 如何将 Future 的结果作为参数传递给非 Future 提供者

问题描述 投票:0回答:1

Stack Overflow 社区!

我在 RiverPod 的 Flutter 项目中面临挑战。我的目标是将

FutureProvider
的结果传递给常规提供商,但我遇到了类型不匹配问题。

问题: 我有一个异步获取

FutureProvider
SharedPreferences
,我需要将其结果用作另一个提供程序中的参数,该提供程序是常规提供程序,而不是
FutureProvider
。这是我的代码片段:

class ProfileRepository {
  final SharedPreferences prefs;

  ProfileRepository({required this.prefs});

  // rest of the methods
}

@riverpod
Future<SharedPreferences> sharedPreferences(SharedPreferencesRef ref) async {
  return await SharedPreferences.getInstance();
}

@riverpod
ProfileRepository profileRepository(ProfileRepositoryRef ref) {
  final prefs = ref.watch(sharedPreferencesProvider); // Returns AsyncValue<SharedPreferences>
  return ProfileRepository(prefs: prefs); // Error here
}

在此设置中,

sharedPreferencesProvider
是获取
FutureProvider
SharedPreferences
。我想将获取的
SharedPreferences
实例传递给
ProfileRepository
。然而,
ref.watch(sharedPreferencesProvider)
给了我一个
AsyncValue<SharedPreferences>
,而不是
SharedPreferences
实例。结果,我收到以下错误:

The argument type 'AsyncValue<SharedPreferences>' can't be assigned to the parameter type 'SharedPreferences'.

我尝试过的:

  • 我考虑过将
    profileRepository
    转换为
    FutureProvider
    ,但这会显着改变现有的架构,我宁愿避免这种情况。
  • 我不确定如何在非异步提供程序的上下文中从
    SharedPreferences
    中提取实际的
    AsyncValue<SharedPreferences>
    实例。

我的问题: 如何正确地将

FutureProvider
SharedPreferences
实例)的结果传递给 RiverPod 中的
ProfileRepository
提供者?是否有更适合这种情况的替代方法或模式?

有关此事的任何建议或指导将不胜感激。谢谢!

flutter dart asynchronous riverpod
1个回答
0
投票

不要使用提供者来保存

SharedPreferences
的实例。相反,在
main
中对其进行初始化,并提供全局“首选项”。然后,所有共享首选项访问都会同步以供阅读。

© www.soinside.com 2019 - 2024. All rights reserved.