【问题标题】:Riverpod StateNotifierProvider depend on a FutureProviderRiverpod StateNotifierProvider 依赖于 FutureProvider
【发布时间】:2022-08-14 13:29:27
【问题描述】:

我有一个依赖于FutureProviderStateNotifierProvider。目前它们如下所示。

final catalogProvider = StateNotifierProvider<CatalogNotifier, CatalogState>((ref) {
  final network = ref.watch(networkProvider.future); // future provider

  return CatalogNotifier(network: network);
});

这使我的CatalogNotifier 接受Future&lt;NetworkProvider&gt; 而不是NetworkProvider 并要求我执行以下操作。

await (await network).doGet(...)

避免等待多个并允许CatalogNotifier 接受裸NetworkProvider 以便我可以像await network.doGet(...) 一样写的最佳方法是什么?


根据要求,为了完整性,以下是其他相关提供商

final networkProvider = FutureProvider<Network>((ref) async {
  final cache = await ref.watch(cacheProvider.future);
  return Network(cacheManager: cache);
});
final cacheProvider = FutureProvider<CacheManager>((ref) async {
  final info = await ref.watch(packageInfoProvider.future);

  final key = \'cache-${info.buildNumber}\';

  return CacheManager(Config(
    key,
    stalePeriod: const Duration(days: 30),
    maxNrOfCacheObjects: 100,
  ));

我确信我可以将我的缓存提供者作为未来的网络提供者,所以它不必是FutureProvider,但我对如何解决上述问题很感兴趣,因为在另一个场景,如果我依赖说 3 或 4 FutureProviders,这可能不是一个选项。

  • 您可以添加networkProvider 代码吗?在这种情况下,您似乎不需要FutureProvider
  • 是的,使用网络提供商及其依赖项更新了问题。但是,我对依赖 StateNotifierProvider 中的 FutureProvider 而不是解决这种特殊情况的最佳方法感兴趣。

标签: flutter dart riverpod


【解决方案1】:

这使我的 CatalogNotifier 接受 Future 而不是 >NetworkProvider 并要求我执行以下操作。

我想不出一种方法来获得你想要的结果。

你不能只接受一个 AsyncValue 并在 statenotifier 中处理它吗?

final catalogProvider = StateNotifierProvider<CatalogNotifier, CatalogState>((ref) {
      final network = ref.watch(networkProvider); // future provider
    
      return CatalogNotifier(network: network);
    });

那么你也能:

void someFunction() async {
  network.maybeWhen(
    data: (network) => AsyncData(await network.doGet(...)), 
    orElse: () => state = AsyncLoading(),
);
}

【讨论】:

  • 我可以。目前我使用未来而不是异步值。只是寻找一种更优雅的方式,如果我的通知程序依赖于其中的一些,如果可能的话,最好不要有额外的等待和括号。
【解决方案2】:

您可以将 AsyncValue 设为 StateNotifier 的子类型,我以 Todo 列表为例。

如下:

class TodoNotifier extends StateNotifier<AsyncValue<List<Todo>>> {

  TodoNotifier(this._ref) : super(const AsyncValue.loading()) {
    _fetchData();
  }

  final Ref _ref;

  Future<void> _fetchData() async {
    state = const AsyncValue.loading();
    // todoListProvider is of type FutureProvider
    _ref.read(todoListProvider).when(data: (data) {
      state = AsyncValue.data(data);
    }, error: (err, stackTrace) {
      state = AsyncValue.error(err, stackTrace: stackTrace);
    }, loading: () {
      state = const AsyncValue.loading();
    });
  }

  void addTodo(Todo todo) {
    if (state.hasValue) {
      final todoList = state.value ?? [];
      state = AsyncValue.data(List.from(todoList)..add(todo));
    }
  }
  ....
}

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 2023-01-25
    • 2020-11-11
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2022-10-25
    • 2021-03-23
    相关资源
    最近更新 更多