将 FutureProvider 合并到 StateNotifierProvider 中

aid*_*ack 9 flutter riverpod

我正在将 Riverpod 与 Freezed Union 一起使用。

我正在尝试合并/观察两个FutureProviders都返回相同类型的两个StateNotifierProvider并使用它们来设置状态。

我注意到,因为我正在观察两个 futureProviders,所以它创建了两个实例StateNotifierProvider......

从日志记录中我可以看到 init 方法被调用两次,clocking state被调用两次,DPS state被调用一次。

我在第一个障碍上失败了,但我的希望是:

  • 显示行程状态(兼作加载屏幕)
  • 获取DPS状态数据
  • 暂停10秒
  • 显示dps状态

我意识到下面的示例没有实现计时器,但我需要找出 StateNotfierProvider 的问题,然后我将继续添加暂停等。

老实说,我什至不确定这是正确的做事方式吗?

我考虑过也许为小部件中的每个未来提供者设置两个消费者,但这似乎有点麻烦。如果我可以在州立提供商中管理多个未来的提供商,那就太好了。

final clockingState = StateNotifierProvider<ClockingNotifier, ClockingState>(
    (ref) => ClockingNotifier(
        ref.watch(loadingItineraryProvider), ref.watch(clockingDps)));

class ClockingNotifier extends StateNotifier<ClockingState> {
  final AsyncValue<ClockingState> itineraryState;
  final AsyncValue<ClockingState> clockingDps;

  ClockingNotifier(this.itineraryState, this.clockingDps)
      : super(ClockingState.init()) {
    init();
  }

  void init() {
    logger.d("the init method");
    itineraryState.whenData((ClockingState clockingState) {
      logger.d("clocking state");
      state = clockingState;
    });
    clockingDps.whenData((ClockingState dps) {
      logger.d("DPS state");
      state = dps;
    });
  }
}

Run Code Online (Sandbox Code Playgroud)

小智 0

如果您仅需要 ClockingNotifier 的 FutureProvider,则应该考虑将它们完全移至 ClockingNotifier 内部(在 init() 方法内调用 Futures 或在 ClockingNotifier 内部添加函数来加载 future 并随后直接更新 Notifier 的状态)。

这为您提供了更多控制权和更好的通知程序流程。