我想把go_router
(https://pub.dev/packages/go_router#redirection)和Riverpod
一起使用。
我有一个Provider
和一个StreamProvider
,我想把它们组合成一个Listenable
,这样它就可以用作GoRouter
的refreshListenable
参数。
我想我需要将Provider
和StreamProvider
组合成某种Provider
(如何组合?)。
从Provider
创建Listenable
的最简单方法是什么
编辑:我知道这“否定”了Riverpod的意义,但这个应用已经和Riverpod一起设置好了,我只想添加go_router。
发布于 2021-11-05 19:09:14
有一种简单得多的方法,因为ChangeNotifier可以与Riverpod一起使用。在Riverpod的Github repo上有一个Gihtub问题。https://github.com/rrousselGit/river_pod/issues/884
在Gihtub上由Tim Whitting回答(他的代码和评论如下):
您可以在flutter_riverpod中使用ChangeNotifier。
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();
发布于 2021-10-10 18:33:25
我的解决方法如下:
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,...);
https://stackoverflow.com/questions/69512241
复制相似问题