日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

flutter?Bloc?add兩次只響應(yīng)一次問(wèn)題解析_Android

作者:李小轟_Rex ? 更新時(shí)間: 2022-12-12 編程語(yǔ)言

問(wèn)題描述

連續(xù)調(diào)用兩次addEvent,結(jié)果最終只能響應(yīng)一次,第二次事件無(wú)法響應(yīng)。

@override
  Stream<SomeState> mapEventToState(SomeEvent event) async*{
    if(event is InCreaseEvent){
      state.num ++;
      yield state;
    }
  }
someBloc.add(InCreaseEvent());
someBloc.add(InCreaseEvent());

原因分析

bloc 繼承于 cubit , 查看 cubit 源碼得知,狀態(tài)更新時(shí)做了判斷,如果接收到的 newState 與 currentState 為同一個(gè)對(duì)象,則直接 return,不響應(yīng)本次狀態(tài)變更。

處理方式

1. State實(shí)現(xiàn)copyWith()方法每個(gè)State類(lèi)都要有copy()方法,用于產(chǎn)生state對(duì)象的副本;每次編輯 state 的字段內(nèi)容,然后 yield 副本,保證每次 yield 的都是新的對(duì)象。

class SomeBloc extends Bloc<SomeEvent, SomeState>{
  SomeState _currentState;
  SomeBloc(SomeState initialState) : super(initialState){
    _currentState = initialState;
  }
  @override
  Stream<SomeState> mapEventToState(SomeEvent event) async*{
    if(event is InCreaseEvent){
      _currentState.num ++;
      //每次 yield 新對(duì)象
      yield _currentState.copyWith();
    }
  }
}
class SomeState{
  int num;
  SomeState(this.num);
  ///新加 copyWith 方法用于生成副本
  SomeState copyWith(){
    return SomeState(num);
  }
}
abstract class SomeEvent{}
class InCreaseEvent extends SomeEvent{}

2.使用Equatable state繼承Equatable重寫(xiě)get方法

原文鏈接:https://juejin.cn/post/7006213343996280868

欄目分類(lèi)
最近更新