仅在 Flutter 框架中通过声明的操作强制更改 MobX 状态

Forcing the MobX state to be changed through declared actions only in the Flutter framework

我正在 Flutter 中试验 MobX 状态管理解决方案。我真的很喜欢它的简洁和简单,但我有点担心它改变状态的方式可能带来的缺点。 从理论上讲,我们可以强制仅使用操作来改变状态,这很棒,因为我们可以使用包提供的间谍功能来了解更改的历史记录。 但是,如果我们不使用特定的操作,框架会自动创建操作。例如,在下面的代码中,我创建了一个计数器存储 class 并在 main 函数中使用它为计数器分配一个新值,而无需使用预先声明的操作。之前已将严格模式设置为“始终”。


abstract class _Counter with Store {
  @observable
  int value = 0;

  @action
  void increment() {
    value++;
  }
}

final counter = Counter(); // Instantiate the store
void main() {
  mainContext.config = mainContext.config
      .clone(isSpyEnabled: true, writePolicy: ReactiveWritePolicy.always);
  mainContext.spy((event) {
    print("event name : " + event.name);
    print("event type : " + event.type);
  });
  Counter counter = Counter();
  counter.value = 10;
}

我原以为会出现一个错误,说不可能在操作之外更改状态,但这并没有发生,因为会自动创建一个名为 value_set 的临时操作。那么,我想知道,如果可以避免使用操作,那么强制使用操作的意义何在。我的意思是,如果我们直接改变状态,一个动作会自动创建并被间谍功能看到,从而使所有过程更加健壮和可预测,但是,如果我只想通过我之前实施的动作来改变状态怎么办?有办法吗?比如我刚才提供的计数器代码,有没有办法让计数器的增量只增加1?因为,在 Mobx 的工作方式中,我可以在代码的任何地方写类似

counter.value = 10

这会工作得很好,没有任何问题。我认为强迫人们使用预设动作可以大大提高可预测性并促进团队合作。 我试图将值变量设为私有,但它仍然可以从外部访问,如果使用 @readonly 注释也是如此。

嗯,这对我来说也很奇怪,因为它在 MobX JS 中的工作方式不同(就像你描述的一样),但 Dart MobX 似乎改变了单个字段值的行为,它们现在自动包装在动作中,是的。

也许应该有一个可选的规则来再次打开严格检查,这很有意义。我建议您在 Dart MobX Github.

上创建和发布或讨论

那里有更多信息:https://github.com/mobxjs/mobx.dart/issues/206

最后,我发现我正在寻找的行为可以通过 @readonly 注释获得。使用 @readonly 注释标记变量可避免自动创建其 setter 和 getter 方法。而且要求注解变量为private,拒绝直接设置变量

注:顺便说一句,Dart语言实现的方式,需要定位到Counter在单独的文件中提供所需的行为,否则无论如何都可以访问其私有字段。