我在 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
提供者?是否有更适合这种情况的替代方法或模式?
有关此事的任何建议或指导将不胜感激。
不要使用提供者来保存
SharedPreferences
的实例。相反,在 main
中对其进行初始化,并提供全局“首选项”。然后,所有共享首选项访问都会同步以供阅读。