如何从 Riverpod 供应商处获得 Listenable?
How to get a Listenable from a Riverpod Provider?
我想将 go_router
(https://pub.dev/packages/go_router#redirection) 与 Riverpod
一起使用。
我有一个 Provider
和一个 StreamProvider
,我想将它们组合成一个 Listenable
,这样它就可以用作 refreshListenable
的参数16=].
我想我需要将 Provider
和 StreamProvider
组合成某种 Provider
(怎么做?)。
从 Provider
创建 Listenable
的最简单方法是什么?
编辑:我知道这 'negates' Riverpod 的要点,但是该应用程序已经用 Riverpod 进行了所有设置,我只想添加 go_router.
我是这样解决的:
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,...);
有一种更简单的方法,因为 ChangeNotifier 可以与 Riverpod 一起使用。 Riverpod 的 Github 存储库中有一个关于此的 Gihtub 问题。
https://github.com/rrousselGit/river_pod/issues/884
Tim Whitting 在 Gihtub 上的回答(他的代码和评论如下):
您可以将 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();
如果要集中使用riverpod,可以直接用它导航,不用go_router。
这里有一个有趣的问题:river_pod issues 1122
我想将 go_router
(https://pub.dev/packages/go_router#redirection) 与 Riverpod
一起使用。
我有一个 Provider
和一个 StreamProvider
,我想将它们组合成一个 Listenable
,这样它就可以用作 refreshListenable
的参数16=].
我想我需要将 Provider
和 StreamProvider
组合成某种 Provider
(怎么做?)。
从 Provider
创建 Listenable
的最简单方法是什么?
编辑:我知道这 'negates' Riverpod 的要点,但是该应用程序已经用 Riverpod 进行了所有设置,我只想添加 go_router.
我是这样解决的:
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,...);
有一种更简单的方法,因为 ChangeNotifier 可以与 Riverpod 一起使用。 Riverpod 的 Github 存储库中有一个关于此的 Gihtub 问题。 https://github.com/rrousselGit/river_pod/issues/884
Tim Whitting 在 Gihtub 上的回答(他的代码和评论如下):
您可以将 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();
如果要集中使用riverpod,可以直接用它导航,不用go_router。 这里有一个有趣的问题:river_pod issues 1122