Flutter 如何使用Riverpod注入SharedReferences依赖项
我想用SharedPreferences.getInstance()方法在我的一个数据源中注入一个SharedPreferences实例,但我遇到了困难,因为getInstance()返回一个Future。这是我的提供商文件:Flutter 如何使用Riverpod注入SharedReferences依赖项,flutter,dart,sharedpreferences,riverpod,Flutter,Dart,Sharedpreferences,Riverpod,我想用SharedPreferences.getInstance()方法在我的一个数据源中注入一个SharedPreferences实例,但我遇到了困难,因为getInstance()返回一个Future。这是我的提供商文件: import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:sh
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shopping_list/features/shopping_list/data/datasources/item_local_data_source.dart';
import 'package:shopping_list/features/shopping_list/data/repositories/item_repository_impl.dart';
import 'package:shopping_list/features/shopping_list/domain/repositories/item_repository.dart';
import 'item_list_state.dart';
import 'package:shopping_list/core/usecases/usecases.dart';
import 'package:shopping_list/features/shopping_list/domain/usecases/cache_items_list.dart';
import 'package:shopping_list/features/shopping_list/domain/usecases/get_items_list.dart';
import 'package:shopping_list/features/shopping_list/presentation/logic/item_list/item_list_state.dart';
import 'package:shopping_list/features/shopping_list/domain/entities/ingredient.dart';
part 'item_list_state_notifier.dart';
final sharedPreferencesProvider = Provider(
(ref) => SharedPreferences.getInstance()
);
final _localDataSourceProvider = Provider<ItemLocalDataSource>(
(ref) =>
ItemLocalDataSourceImpl(sharedPreferences: ref.watch(sharedPreferencesProvider))
);
final _itemRepositoryProvider = Provider<ItemRepository>(
(ref) => ItemRepositoryImpl(localDataSource: ref.watch(_localDataSourceProvider))
);
final _getItemsListProvider =
Provider<GetItemsList>((ref) => GetItemsList(ref.watch(_itemRepositoryProvider)));
final _cacheItemsListProvider =
Provider<CacheItemsList>(
(ref) => CacheItemsList(ref.watch(_itemRepositoryProvider))
);
final itemListNotifierProvider =
StateNotifierProvider<ItemListNotifier, ItemListState>((ref) =>
ItemListNotifier(
getItemsList: ref.watch(_getItemsListProvider),
cacheItemsList: ref.watch(_cacheItemsListProvider)));
导入“包:颤振_riverpod/颤振_riverpod.dart”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“package:shopping_list/features/shopping_list/data/datasources/item_local_data_source.dart”;
导入“包:购物清单/功能/购物清单/数据/存储库/项目存储库\u impl.dart”;
导入“package:shopping_list/features/shopping_list/domain/repositories/item_repository.dart”;
导入“项目列表状态.dart”;
导入“包:购物清单/core/usecases/usecases.dart”;
导入“package:shopping_list/features/shopping_list/domain/usecases/cache_items_list.dart”;
导入“package:shopping_list/features/shopping_list/domain/usecases/get_items_list.dart”;
导入“包:购物清单/功能/购物清单/演示/逻辑/项目清单/项目清单状态.dart”;
导入“package:shopping_list/features/shopping_list/domain/entities/component.dart”;
“项目列表状态通知程序.dart”部分;
最终SharedReferencesProvider=提供程序(
(ref)=>SharedReferences.getInstance()
);
final _localDataSourceProvider=提供程序(
(参考)=>
ItemLocalDataSourceImpl(SharedReferences:ref.watch(SharedReferencesProvider))
);
最终_itemRepositoryProvider=提供程序(
(ref)=>ItemRepositoryImpl(localDataSource:ref.watch(_localDataSourceProvider))
);
最终_getItemsListProvider=
提供者((ref)=>GetItemsList(ref.watch(_itemRepositoryProvider));
最终_cacheItemsListProvider=
提供者(
(ref)=>CacheItemsList(ref.watch(_itemRepositoryProvider))
);
最终项目列表通知提供者=
StateNotifierProvider((ref)=>
ItemListNotifier(
getItemsList:ref.watch(_getItemsListProvider),
cacheItemsList:ref.watch(_cacheItemsListProvider));
我尝试在ProviderScope中重写SharedReferencesProvider,但没有帮助
使用Riverpod实例化SharedReference的最佳方法是什么?您可以使用
FutureProvider
,例如:
final configProvider = FutureProvider<Configuration>((ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;
return Configuration.fromJson(content);
});
final configProvider=FutureProvider((ref)异步{
最终内容=json.decode(
等待rootBundle.loadString('assets/configurations.json'),
)作为地图;
返回Configuration.fromJson(content);
});
所以在你的情况下,应该是这样的:
final configProvider = FutureProvider<SharedPreferences>((ref) async {
final prefs = await SharedPreferences.getInstance();
return prefs;
});
final configProvider=FutureProvider((ref)异步{
final prefs=wait SharedPreferences.getInstance();
返回优先级;
});
更多信息:我明白了,但我不明白如何使用FutureProvider来实例化我的datasource类,它在构造函数中接受SharedReferences实例。在文档中,它展示了如何在UI中使用它的示例,但这不是我想要做的。您可以尝试组合提供程序,例如,为数据源类创建一个提供程序,并在init代码中,等待SharedReferences提供程序初始化。大概是这样的: