在监听 ObservableList 的 mobx 反应中获得相同的值

Getting same values on mobx reaction listening an ObservableList

我在 flutter 上使用 mobx 包。 (全部在最新的稳定版本上)

我正在尝试使用 reaction 列出 ObservableList 的更新,reaction 只调用一次,因为在接下来的调用中,新值和旧值相等,我不明白为什么。代码的所有其他部分都符合预期 运行。

示例代码:

abstract class _TesteControllerBase with Store {
  _TesteControllerBase() {
    reaction((_) => list, (list) {
      // print(list.length);
    }, equals: (newValue, oldValue) {
      print('newValue: $newValue');
      print('oldValue: $oldValue');

      return newValue == oldValue;
    });
  }

  @observable
  ObservableList<String> list = ObservableList();

  @action
  addNew() {
    list.add('${list.length + 1}');
  }
}

打印将相同的值返回给 newValue 和 oldValue(附图)。

运行 代码的图像:

此行为的原因是您比较数组,这意味着您比较它们在内存中的引用,而不是它们的内容。简单示例:

var arr1=[];
var arr2=[];
arr1 === arr2 // false

数组内容相同,但在内存中的地址不同

因此,当您跟踪 list 的更改时,您跟踪的是引用是否更改。这就是为什么它只在第一次工作,当它在内存中没有地址时(null),然后数组被初始化。

你可以做的是 stringify 数组,所以它的每一个变化都会被跟踪(元素的添加、删除、更新)。您的反应将如下所示:

 reaction((_) => JSON.stringify(list), (stringifiedList) {
      // print(JSON.parse(stringifiedList).length);
    });

现在不需要 equals 函数,因为 mobx 会在内部为您进行比较