在监听 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 会在内部为您进行比较
我在 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 会在内部为您进行比较