同一 BLoC 事件不会触发多次

sha*_*ain 5 dart flutter bloc

我已经下课HomeBlocHomeView基本的UI架构如下:

HomeView extends StatelessWidget {
    BlocProvider( child: HomeBody(), bloc: new HomeBloc() )
}

HomeBody extends StatefulWidget {
    createState => HomeBodyState()
}

HomeBodyState extends State {
    BlocBuilder(
        bloc: BlocProvider.of<HomeBloc>()
        child: Container(
            child: Column(
                children: [
                    BlocProvider( child: CashFlowView, bloc: new HomeBloc() )
                ]
            )
        )
    )
}

CashFlowView extends StatefulWidget {
    createState => CashFlowState()
}

CashFlowState extends State {
    BlocBuilder(
        bloc: BlocProvider.of<HomeBloc>()
        child: Container(
            child: Column(
                children: [
                    ChipGroupWidget(
                      onClick => BlocProvider.of().add(event) //  <----- Problem is here
                    )
                ]
            )
        )
    )
}
Run Code Online (Sandbox Code Playgroud)

完整代码可以在此存储库中找到。问题是,当Chipmy 内部的任何内容ChipGroup被点击时,都会在 中调用回调函数CashFlowState。在其中,一个 bloc 事件被添加到带有一些数据的 bloc 中。但它只是第一次触发。我的代码有什么问题吗?

小智 2

在 flutter bloc 模式系统中,只有当状态发生变化时才会重建 UI。在任何情况下,如果触发的事件触发块当前所处的相同状态,则不会再次调用构建函数,即不会重建 UI。

在您的情况下,当第一次CashFlowState产生时,整个代码工作得很好。但随后再次产生相同的状态,事件被触发,但构建函数不会再次被调用,因为状态从未改变。

您要做的是创建两种不同的状态以及两个不同的事件。可以说,chipTappedEvent将会屈服chipTappedState,并且chipResetEvent将会屈服chipResetState

一开始您可以使用chipResetState或任何其他状态作为初始状态。然后,当用户点击芯片时,只需触发chipTappedEventwhich 应该产生chipTappedState

在你的监听器中,监听状态chipTappedState并做你必须做的事情。然后立即触发chipResetEventwhich shouldyield chipResetState。这样,当用户再次点击芯片时,屈服状态将与chipTappedState不同chipResetState,因此将再次调用构建函数。