Abd*_*han 9 equatable flutter-bloc
我正在尝试在 bloc 类中实现复选框逻辑。为此,我List<bool> checked在块类中创建的代码如下。当CheckBoxClicked事件触发时,状态第一次更新,我可以看到该框已选中。
class CartProductsListBloc
extends Bloc<CartProductsListEvent, CartProductsListState> {
CartProductsListBloc() : super(InitialCartProductsListState());
final ProductRepository productRepository = ProductRepository();
List<bool> checked = List<bool>();
var productsList;
@override
Stream<CartProductsListState> mapEventToState(
CartProductsListEvent event) async* {
if (event is FetchCartProductsList) {
yield FetchingInProgress();
try {
productsList = await productRepository.loadListOfProductInUserCart();
//initialize checked according to productsList
for (int i = 0; i < productsList.length; i++) {
checked.add(false);
}
yield FetchCartProductsListSuccess(
productsList: productsList, checked: checked);
} catch (error) {
yield FetchCartProductsListFail(
error: 'Fail to laod data. Please try again\nOr Report the issue');
}
}
if (event is CheckBoxClicked) {
checked[event.index] = !checked[event.index];
yield CheckedBoxClickedHappened(
productsList: productsList, checked: checked);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但此后无论CheckBoxClicked调用事件多少次,状态 UI 都不会更新。当我热刷新时,会出现更改,这意味着逻辑工作正常,但问题是 Equatable 无法检测列表/数组索引中的更改。以下是状态代码CheckedBoxClickedHappened。
class CheckedBoxClickedHappened extends CartProductsListState {
final productsList;
final checked;
const CheckedBoxClickedHappened({@required this.productsList, @required this.checked});
@override
List<Object> get props => [productsList, checked];
}
Run Code Online (Sandbox Code Playgroud)
注意:我通过添加 in bloc 类解决了这个问题int count = 0;,并且每次CheckBoxClicked触发事件时我都会更新 count++,如下所示
if (event is CheckBoxClicked) {
checked[event.index] = !checked[event.index];
yield CheckedBoxClickedHappened(
productsList: productsList, checked: checked, count: count++);
}
Run Code Online (Sandbox Code Playgroud)
并处于状态
@override
List<Object> get props => [productsList, checked, count];
Run Code Online (Sandbox Code Playgroud)
问题的目的是想知道,Equatable 是否无法检测到 List 索引的变化,或者我做错了什么?如果有任何困惑,请询问我会改进它。
小智 0
是的,因为列表是可变的。为了检测列表中的更改,您需要对列表进行深层复制,此处提供了一些进行深层复制的方法: https: //www.kindacode.com/article/how-to-clone-a- dart-and-flutter 中的列表或映射/
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |