【问题标题】:Flutter - Bloc only emits state when the state is not extending EquatableFlutter - Bloc 仅在状态未扩展 Equatable 时发出状态
【发布时间】:2021-01-07 21:00:59
【问题描述】:

我最近开始使用 bloc 并卡在这里。

我有一个状态:

class BasketState extends Equatable{
  final Map<Item, int> itemsOrdered;

  BasketState(this.itemsOrdered);

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

还有以下集团:

class BasketBloc extends Bloc<BasketEvent, BasketState> {
  Map<Item, int> _itemsOrdered = {};
  BasketBloc() : super(BasketState({}));

  @override
  Stream<BasketState> mapEventToState(BasketEvent event) async* {
    if (event is BasketAdd) {
      _itemsOrdered.putIfAbsent(event.item, () => event.amount);
    } else if (event is BasketRemove) {
      _itemsOrdered.remove(event.item);
    }
    yield BasketState(_itemsOrdered);
  }
}

只有在我第一次发送 BasketAdd 事件时,块才会发出状态,然后如果我再次发送 BasketAdd 事件,块不会发出任何东西。

唯一有效的方法是从状态中删除 Equatable,我不知道为什么。

我做错了吗?

【问题讨论】:

    标签: flutter events stream state bloc


    【解决方案1】:

    Equatable 正在使用 get props 函数进行比较。

    改变

      @override
      List<Object> get props => throw UnimplementedError();
    

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

    再试一次

    编辑:答案现在在 cmets 中,但另一个可能的问题是可变性。在这种情况下,我们应该每次都产生一个新的 Map,而不是产生 itemsOrdered。

      yield BasketState(new Map<Item, int>.from(itemsOrdered));
    

    【讨论】:

    • 哦,抱歉,我在写问题的时候忘记了。在我的真实应用中是正确的,现在我编辑了问题。
    • 不幸的是,在那之后我在猜测。一个快速而肮脏的解决方法是产生一个“加载”状态(随便叫什么,BasketLoading)然后再次产生 BasketState。我怀疑正在发生的事情是它正在比较它认为不可变的两个可变对象(地图)。而不是 yield BasketState(_itemsOrdered) 我想知道 yield BasketState(new Map.from(_itemsOrdered)) 是否可行。
    猜你喜欢
    • 2021-03-19
    • 2020-10-10
    • 2020-06-17
    • 2022-11-29
    • 2023-03-23
    • 2022-10-06
    • 2020-05-06
    • 2022-08-11
    • 1970-01-01
    相关资源
    最近更新 更多