【问题标题】:How to get a Listenable from a Riverpod Provider?如何从 Riverpod Provider 获取 Listenable?
【发布时间】:2021-10-10 04:14:51
【问题描述】:

我想将go_router (https://pub.dev/packages/go_router#redirection) 与Riverpod 一起使用。

我有一个Provider 和一个StreamProvider,我想将它们组合成一个Listenable,这样它就可以用作GoRouterrefreshListenable 参数。

我想我需要将ProviderStreamProvider 组合成某种Provider(如何?)。

Provider 创建Listenable 的最简单方法是什么?

编辑:我知道这“否定”了 Riverpod 的观点,但该应用程序已经与 Riverpod 一起设置,我只想添加 go_router。

【问题讨论】:

    标签: flutter dart riverpod


    【解决方案1】:

    有一种更简单的方法,因为可以将 ChangeNotifier 与 Riverpod 一起使用。 Riverpod 的 Github repo 上有一个 Gihtub 问题。 https://github.com/rrousselGit/river_pod/issues/884

    由 Tim Whitting 在 Gihtub 上回答(他的代码和 cmets 下面):

    您可以将 ChangeNotifier 与 flutter_riverpod 一起使用。

    final myNotifierProvider = ChangeNotifierProvider<MyNotifier>((ref) => MyNotifier());
    class MyNotifier with ChangeNotifier {
      void refresh(){
        notifyListeners();
      }
    }
    

    然后你必须观察你试图通过 Listenable 的提供者。

    // 1.0.0-dev riverpod
    refreshListenable: ref.watch(myNotifierProvider)
    // 0.14.0
    refreshListenable: watch(myNotifierProvider) // using a Consumer / ConsumerWidget
    
    

    在别处使用

    // 1.0.0-dev riverpod
    ref.read(myNotifierProvider.notifier).refresh();
    // 0.14.0
    context.read(myNotifierProvider.notifier).refresh();
    

    【讨论】:

    • 有没有办法使用 StateNotifier 而不是 ChangeNotifier ?我试图这样做,但无法使其工作
    【解决方案2】:

    我是这样解决的:

    class AListenable extends ValueNotifier {
      AListenable(value) : super(value);
    
      void changeValue(newValue) {
        value = newValue;
      }
    }
    
       
     final aListenableInstance = AListenable(false);
    
     final myProvider = Provider((ref) {
    
      final my2ndProviderValue = ref.watch(my2ndProvider);
    
      if (my2ndProviderValue is AsyncError || my2ndProviderValue is AsyncLoading) {
        aListenableInstance.changeValue(false);
        return false;
      }
    
      aListenableInstance.changeValue(true);
      return true;
    });
    
    final _router = GoRouter(
        refreshListenable: aListenableInstance,...);
    

    【讨论】:

      【解决方案3】:

      如果你想密集使用riverpod,你可以直接用它导航,不用go_router。 这里有一个有趣的问题:river_pod issues 1122

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-07
        • 2021-05-06
        • 2021-06-07
        • 2021-10-19
        • 2021-02-07
        • 2021-04-29
        • 1970-01-01
        • 2021-01-25
        相关资源
        最近更新 更多