【问题标题】:Same BLoC event not triggering more than one time同一 BLoC 事件触发次数不超过一次
【发布时间】:2020-08-04 14:41:47
【问题描述】:

我有来自HomeView 班级的HomeBloc。基本 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
                    )
                ]
            )
        )
    )
}

完整代码可在this repository 中找到。 问题是当我的ChipGroup 中的任何Chip 被点击时,会在CashFlowState 中调用回调函数。在其中,一个 bloc 事件被添加到 bloc 与一些数据。但它只是第一次触发。我的代码有什么问题?

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    来自bloc library documentation
    使用 equatable 扩展您的状态类,并在每个事件之后使用新属性(数据)发出一个新状态(相同类型)

    【讨论】:

      【解决方案2】:

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

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

      您要做的是,创建两个不同的状态以及两个不同的事件。假设chipTappedEvent 将产生chipTappedStatechipResetEvent 将产生chipResetState

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

      在你的监听器中,监听chipTappedState 的状态并做你必须做的事情。然后立即触发chipResetEvent,它应该产生chipResetState。这样,当用户再次点击芯片时,yield状态为chipTappedState,与chipResetState不同,所以再次调用build函数。

      【讨论】:

        猜你喜欢
        • 2020-12-11
        • 2021-11-24
        • 2021-03-29
        • 2022-01-01
        • 2023-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多