Flutter 颤振:BlocBuilder没有更新,尽管我在调试器中看到了新的/不同的状态

Flutter 颤振:BlocBuilder没有更新,尽管我在调试器中看到了新的/不同的状态,flutter,state,bloc,Flutter,State,Bloc,我今天第二件奇怪的事。当我跟随bloc.dart(库,而不是我的文件)中的调试器时,我看到transition.nextState==state&&u emissed是false,它不会更新我的小部件(nextState的列表大小为2,state的列表大小为10-\u emissed为true)。据我所知,建设者应该是好的,有没有其他地方可以看看为什么它不更新 在我展示代码之前先解释一下逻辑 我在应用程序启动时使用 BlocProvider(create: (context) => L

我今天第二件奇怪的事。当我跟随bloc.dart(库,而不是我的文件)中的调试器时,我看到
transition.nextState==state&&u emissed
false
,它不会更新我的小部件(nextState的列表大小为2,state的列表大小为10-\u emissed为true)。据我所知,建设者应该是好的,有没有其他地方可以看看为什么它不更新

在我展示代码之前先解释一下逻辑

  • 我在应用程序启动时使用

    BlocProvider(create: (context) =>
      LogicGraphsPStmntBloc(logicGraphsRepository:
      logicGraphsRepository)..add(LogicGraphsNextProblemRequested()),
    
  • 这将返回一个包含10个字符串的列表,我将其存储在我的_bloc.dart文件中(不确定这是否是最先进的)

  • 这10个字符串通过状态
    LogicGraphsPStmntLoadSuccess(语句)
    发送,并正确呈现为按钮

  • 如果我点击一个按钮,只会显示第一个和选定的字符串。按下
    onPressed:(){BlocProvider.of(context).add(LogicGraphsPStmntCollapsed(语句:index-1));},

  • 这将正确触发状态
    yield LogicGraphsPStmntLoadSuccess(statementsShown)现在列表中只有2个元素(与步骤3中的10个相比),但不会导致重新排序

  • 如果我使用调试器进入状态,我可以看到这两个状态都有不同数量的元素

  • 我的国家

    抽象类LogicGraphsPStmntState扩展了Equalable{
    常量LogicGraphsPStmntState();
    @凌驾
    列表获取道具=>[];
    }
    类LogicGraphsPStmntLoadSuccess扩展了LogicGraphsPStmntState{
    常量逻辑图HSPSTMNTLOADSUCCESS([this.statements=const[]);
    最后清单说明;
    @凌驾
    列表获取道具=>[];
    @凌驾
    String-toString()=>“LogicGraphsPStmntLoadSuccess{statements:$statements}”;
    }
    
    my bloc(不完全是,因为释放状态的子函数中的代码未达到中所述的状态。因此,目前我在mapEventToState中将这些子函数行作为意大利面条=

    class LogicGraphsPStmntBloc扩展了Bloc{
    LogicGraphsPStmntBloc({@required this.LogicGraphRepository}):超级(LogicGraphsPStmntInProgress());
    最终逻辑图存储库逻辑图存储库;
    清单说明;
    int currentProblem=-1;
    @凌驾
    Stream mapEventToState(LogicGraphSpstmentEvent事件)异步*{
    if(事件为LogicGraphNextProblemRequested){
    _mapLGPStmntNewProblemRequested();
    _mapLGPStmntLoadRequested(当前问题);
    }
    else if(事件为LogicGraphsPStmntLoadRequested){
    _mapLGPStmntLoadRequested(当前问题);
    }
    else if(事件为LogicGraphsPStmntCollapsed){
    _mapLGPStmntCollapseRequested(事件);
    }
    流_mapLGPStmntNewProblemRequested()异步*{
    试一试{
    当前问题=
    等待getNextProblem(currentProblem==null?-1:currentProblem);
    声明=
    等待LogicgraphRepository.getProblemStmntList(currentProblem);
    _mapLGPStmntLoadRequested(当前问题);
    }接住{
    屈服逻辑图hspstmntloadfailure();
    }
    }
    Stream _mapLGPStmntLoadRequested(整数问题)异步*{
    试一试{
    收益逻辑图HSPSTMNTLOADSUCCESS(语句);
    }接住{
    屈服逻辑图hspstmntloadfailure();
    }
    }
    已请求的流_mapLGPStmntCollapseRequested(
    LogicGraphsPStmntCollapsed事件)异步*{
    列表语句shown=[];
    语句聚焦=event.statement;
    语句shown.add(语句[0]);
    语句shown.add(语句[语句聚焦]);
    产量逻辑图HSPSTMNTLOADSUCCESS(说明);
    }
    }
    
    我的小部件

    类LogicGraphPage扩展了无状态小部件{
    最终LogicGraphRepository LogicGraphRepository=LogicGraphRepository(
    logicGraphsApiClient:logicGraphsApiClient());
    @凌驾
    小部件构建(构建上下文){
    返回式CupertinoPageScaffold(
    孩子:BlocProvider(
    创建:(上下文)=>
    LogicGraphsPStmntBloc(LogicGraphRepository:LogicGraphRepository)
    …添加(LogicGraphsNextProblemRequested()),
    孩子:BlocBuilder(
    生成器:(上下文、状态){
    if(状态为LogicGraphsPStmntLoadSuccess){
    最终列表声明=state.statements;
    返回ListView.builder(
    itemCount:statements.length,
    itemBuilder:(构建上下文,int索引){
    返回CupertinoButton(
    填充:边缘集。全部(0),
    子项:文本(语句[索引])
    onPressed:(){BlocProvider.of(context).add(LogicGraphsPStmntCollapsed(语句:index-1));},
    );
    });
    }
    else返回容器();
    }
    )
    ),
    );
    }
    }
    
    bloc.dart库中的函数,我将在其中假设新状态已发出。您会看到行
    if(transition.nextState==state&&&&u emitted)返回;
    。下一个状态有2个元素,state有10个元素,\u emitted为true,因此我假设代码将继续。相反,将触发返回并发出带有
    的行(transition.nextState);
    被跳过

    非常感谢您的帮助,因为这是我第一次使用BLoC/equatable和Flatter,总体来说对我来说还是很新的。但我正在进步

    void\u bindEventsToState(){
    _transitionSubscription=transformTransitions(
    变革事件(
    _eventController.stream,
    (事件)=>mapEventToState(事件).map(
    (nextState)=>转换(
    当前状态:状态,
    事件:事件,,
    下一个状态:下一个状态,
    ),
    ),
    ),
    ).听着(
    
    yield LogicGraphsPStmntChangeStatement;
    yield LogicGraphsPStmntLoadSuccess(statementsShown);