gpt4 book ai didi

flutter - 为什么当我在 dart 中使用一个带有 equatable 的类并且只是一个列表作为属性时,copyWith 方法返回相同的对象,相同的 hascode

转载 作者:行者123 更新时间:2023-12-05 06:47:40 24 4
gpt4 key购买 nike

我使用的是 bloc,它按预期工作,但今天我注意到当我使用 copyWith 发送相同状态 (RefreshState) 时出现了一个奇怪的行为,该状态在第二次调用后没有触发。然后我做了一个测试,创建两个对象并比较它们,但结果是它们是同一个对象,非常奇怪。

那么为什么会这样呢?这是我的类(class):

 class Model extends Equatable {
final List<Product> mostBuyProducts;

const Model({
this.mostBuyProducts,
});

Model copyWith({
List<Product> mostBuyProducts,
}) =>
Model(
mostBuyProducts: mostBuyProducts ?? this.mostBuyProducts,
);

@override
List<Object> get props => [
mostBuyProducts,
];
}

然后我使用 CopyWith 方法(在 Bloc 内部):

  Stream<State> _onDeleteProduct(OnDeleteProduct event) async* {
state.model.mostBuyProducts.removeWhere((p) => p.id == event.id);

var newMostBuyProducts = List<Product>.from(state.model.mostBuyProducts);

final model1 = state.model;
final model2 = state.model.copyWith(mostBuyProducts: newMostBuyProducts);

final isEqual = (model1 == model2);

yield RefreshState(
state.model.copyWith(mostBuyProducts: newMostBuyProducts));
}

isEqual 返回真:/

顺便说一句,这是我的州级

@immutable
abstract class State extends Equatable {
final Model model;
State(this.model);

@override
List<Object> get props => [model];
}

最佳答案

是的,因为列表是可变的。为了检测列表中的更改,您需要对列表进行深度复制。此处提供了一些制作深拷贝的方法:https://www.kindacode.com/article/how-to-clone-a-list-or-map-in-dart-and-flutter/

在下面的解决方案中使用这样一种方法!只需将 copyWith 方法更改为以下方法即可。

Model copyWith({
List<Product> mostBuyProducts,
}) =>
Model(
mostBuyProducts: mostBuyProducts ?? [...this.mostBuyProducts],
);

关于flutter - 为什么当我在 dart 中使用一个带有 equatable 的类并且只是一个列表作为属性时,copyWith 方法返回相同的对象,相同的 hascode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66995749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com