Flutter bloc state 在更新 List/array 索引时不更新状态

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 中的列表或映射/