【问题标题】:How to inject SharedPreferences dependency with Riverpod如何使用 Riverpod 注入 SharedPreferences 依赖项
【发布时间】:2021-05-27 17:22:23
【问题描述】:

我想使用 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)));

我尝试覆盖 ProviderScope 中的 sharedPreferencesProvider 但没有帮助。

使用 Riverpod 实例化 SharedPreferences 的最佳方法是什么?

【问题讨论】:

    标签: flutter dart sharedpreferences riverpod


    【解决方案1】:

    您可以为此使用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<SharedPreferences>((ref) async {
      final prefs = await SharedPreferences.getInstance();
    
      return prefs;
    });
    

    更多信息:https://pub.dev/documentation/riverpod/latest/riverpod/FutureProvider-class.html

    【讨论】:

    • 我明白了,但我不明白如何使用 FutureProvider 来实例化我的数据源类,该类在其构造函数中采用 SharedPreferences 实例。在文档中,它显示了如何在 UI 中使用它的示例,但这不是我想要做的。
    • 您可以尝试合并提供者,例如为您的 Datasource 类创建一个提供程序,并在初始化代码中等待 SharedPreferences 提供程序初始化。像这样:riverpod.dev/docs/concepts/…
    猜你喜欢
    • 2011-11-22
    • 1970-01-01
    • 2021-04-01
    • 2015-09-12
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多