如何在 flutter riverpod 中监听特定变量?
How to listen to a specific variable in flutter riverpod?
我有一个 'homeScreenViewController' 提供程序,它是一个 StateNotifierProvider。它提供的状态是一个有多个变量的class。我希望我的按钮小部件仅在特定变量 'isLoadMoreLoading' 更改时重建。但是当我每次更新任何变量时都像下面这样使用时,我的按钮会重建。如何做到这一点?我正在使用 flutter_riverpod: ^1.0.0.dev6
Consumer(
builder: (context, ref, child) {
var _isLoadMoreLoading = ref.watch(homeScreenViewController).isLoadMoreLoading;
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
if (!_isLoadMoreLoading) {
await ref
.read(homeScreenViewController.notifier)
.loadMorePokemons();
WidgetsBinding.instance!
.addPostFrameCallback((_) {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: 100),
curve: Curves.easeInOut);
});
}
},
child: _isLoadMoreLoading
? Container(
width: 50.0,
height: 1.0,
child: LinearProgressIndicator(
color: Colors.black,
minHeight: 1.0,
),
)
: Text('Load More Pokemon'),
),
],
)
],
);
},
),
随着版本 1.0.0 的发布,ref.watch 现在支持使用 myProvider.select((value) => ...)
过滤重建
如果你用过flutter_bloc,我们可以说它是相当于Bloc的buildWhen.
的riverpod
因此,对于您的情况,我们可以这样做:
var _isLoadMoreLoading = ref.watch(homeScreenViewController.select((viewController) => viewController.isLoadMoreLoading));
这将允许消费者小部件仅在 isLoadMoreLoading 变量更新其值时重建。
可以参考这里:https://pub.dev/packages/riverpod/versions/1.0.0-dev.6/changelog
我有一个 'homeScreenViewController' 提供程序,它是一个 StateNotifierProvider。它提供的状态是一个有多个变量的class。我希望我的按钮小部件仅在特定变量 'isLoadMoreLoading' 更改时重建。但是当我每次更新任何变量时都像下面这样使用时,我的按钮会重建。如何做到这一点?我正在使用 flutter_riverpod: ^1.0.0.dev6
Consumer(
builder: (context, ref, child) {
var _isLoadMoreLoading = ref.watch(homeScreenViewController).isLoadMoreLoading;
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
if (!_isLoadMoreLoading) {
await ref
.read(homeScreenViewController.notifier)
.loadMorePokemons();
WidgetsBinding.instance!
.addPostFrameCallback((_) {
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: 100),
curve: Curves.easeInOut);
});
}
},
child: _isLoadMoreLoading
? Container(
width: 50.0,
height: 1.0,
child: LinearProgressIndicator(
color: Colors.black,
minHeight: 1.0,
),
)
: Text('Load More Pokemon'),
),
],
)
],
);
},
),
随着版本 1.0.0 的发布,ref.watch 现在支持使用 myProvider.select((value) => ...)
如果你用过flutter_bloc,我们可以说它是相当于Bloc的buildWhen.
的riverpod因此,对于您的情况,我们可以这样做:
var _isLoadMoreLoading = ref.watch(homeScreenViewController.select((viewController) => viewController.isLoadMoreLoading));
这将允许消费者小部件仅在 isLoadMoreLoading 变量更新其值时重建。
可以参考这里:https://pub.dev/packages/riverpod/versions/1.0.0-dev.6/changelog