我之前分别观察了一些字符串和布尔值的状态,如下所示:

var strSearchProvider = StateProvider<String>((ref) {
  return "";
});

String strSearch  = ref.watch(strSearchProvider ); // this works

这一次,我try 创建一个简单的对象,包括字符串和布尔值:

class AppState {
  String strSerach = "";
  bool playing = false;
  bool searching = false;
  AppState();
}

var appStateProvider = StateProvider<AppState>((ref) {
  return AppState();
});

现在我是这样看的:

// inside consumer buid method
 AppState watchedState = ref.watch(appStateProvider);

// some codes ..
appbar: AppBar(
          actions: !watchedState.searching
              ? [
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: IconButton(
                        icon: const Icon(Icons.search),
                        onPressed: () {
                          ref.read(appStateProvider.notifier).update((state) {
                            state.searching = true;
                            return state;
                          });
                        }),
                  )
                ]
              : [
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: IconButton(
                        icon: const Icon(Icons.clear),
                        onPressed: () {
                          ref.read(appStateProvider.notifier).update((state) {
                            state.searching = false;
                            return state;
                          });
                        }),
                  )
                ],
 //the rest

但当我按下搜索图标时,什么也没有发生,并且没有真正地监视到已监视状态.

那我该怎么做呢?分开提供/观看所有内容是一种好做法吗?

推荐答案

关键是你的状态对象should be immutable.当您考虑简单类型intStringbooldouble时,一切都将按预期运行.但是,一旦您创建了一个对象,例如集合或您自己的类,那么在那个时刻,您应该注意它们的可变性.

要将类设置为immutable,其所有字段都必须标记为final.此外,您还需要注意覆盖hashCode==.当有许多字段时,更改此类对象的实例可能非常不方便.正是出于这些目的,我们创建了freezedequitable包,它们为我们完成了大量工作,包括基于旧实例快速创建新实例的有用的copyWith方法.

至于ListMapSet等藏品--它们是mutable by nature.因此,无论何时需要更改作为集合的状态,都必须创建该集合的新实例.例如,对于列表,执行此操作的简单方法是使用Sprint(state = [...oldState];)或使用List.of方法.

试着坚持这些方面,您的代码将是reactive:)

Dart相关问答推荐

Dart 扩展: don't access members with "this" unless avoiding shadowing

zsh:找不到命令:pub

Flutter:是否可以有多个 Futurebuilder 或一个 Futurebuilder 用于多个 Future 方法?

你如何在 Polymer 中调度和监听自定义事件?

NoSuchMethodError:在 null 上调用了方法validate

多级异步代码中的 Dart 错误

无法将小部件标记为需要构建,因为框架已经在构建小部件的过程中

如何解决Id does not exist错误?

如何在Flutter中正确显示Snackbar?

单击 TextField 小部件时 Flutter 小部件重建

如何在 Dart 中上传文件?

在 Dart 中修改类内的最终字段

如何使用工厂构造函数扩展抽象类?

Dart 库中part和part of背后的原因是什么?

如何在 timeLimit 之后使future 的计算超时?

如何在抽象类中声明工厂构造函数?

如何在 Ubuntu 网络服务器上为 Dart 安装 pub(命令行使用)

Dart 中的 List.shuffle()?

getter 和 setter 如何改变 Dart 中的属性?

如何在 Dart 中为 Completer.CompleteException(exception, stackTrace) 获取当前堆栈跟踪;