Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何使用Riverpod注入SharedReferences依赖项_Flutter_Dart_Sharedpreferences_Riverpod - Fatal编程技术网

Flutter 如何使用Riverpod注入SharedReferences依赖项

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

我想用SharedPreferences.getInstance()方法在我的一个数据源中注入一个SharedPreferences实例,但我遇到了困难,因为getInstance()返回一个Future。这是我的提供商文件:

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提供程序初始化。大概是这样的: