如何在 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