【问题标题】:Can you use BlocListener and BlocBuilder of different Bloc types in Flutter?你能在 Flutter 中使用不同 Bloc 类型的 BlocListener 和 BlocBuilder 吗?
【发布时间】:2021-10-30 21:17:43
【问题描述】:

我有两个 BLoC,需要监听其中一个的状态变化,以便将事件添加到另一个并构建 UI。

我觉得用代码更容易解​​释:

  @override
  Widget build(BuildContext context) {
    return BlocProvider<BlocA>(
      create: (context) => BlocA(),  <------ Create BlocA
      child: BlocProvider<BlocB>(
        create: (context) => BlocB(),  <---- Create BlocB
    
        child: BlocListener<BlocA, StateA>(
          listener: (context, state) {
            if (state is StateA) {
              context.read<BlocB>().add(EventB()); <--- When BlocA is ready, add EventB to BlocB
            }
          },
          child: BlocBuilder<BlocB, StateB>(
            builder: (context, state) {
              if (state is StateBInitial) {
                return Container(color: Colors.yellow); <-- shows initial as expected
              }
              if (state is StateBSuccess) {
                return Container(color: Colors.green); <-- success is never triggered
              }
              return Container(color: Colors.red);
          ),
        ),
      ),
    );
  }

在上面的示例中,我创建了 2 个 BLoC,BlocA 和 BlocB。 我将它们添加到提供程序中,然后创建一个 BlocListener 来侦听 BlocA 更改并将事件添加到 BlocB。

问题是 BlocBuilder 在初始状态之后永远不会触发。 我可以在调试中看到 BlocListener 添加的 Event 已注册并获取并生成数据,但 BlocBuilder 即使状态已更改也不会触发。

就好像 BlocListener 正在调用不同的 BlocB。

【问题讨论】:

  • 你能添加你的状态对象吗?它可能是由不变性问题引起的。 @Joel Broström
  • 也许你的集团接受你的状态,但如果它自上次事件以来没有改变,就不会屈服。如果它不是不可变的,或者如果您使用 Equatable,您忘记将属性添加到 props,则可能会发生这种情况
  • 感谢您的输入,但不幸的是代码已消失。我可以保证所有的道具都准备好了。我之前遇到过问题并多次检查过。

标签: flutter dart bloc flutter-bloc


【解决方案1】:

如果我是对的,您是在尝试与两个集团进行交流?

有一个很好解释的视频教程:https://www.youtube.com/watch?v=ricBLKHeubM

【讨论】:

  • 是的。当一个集团返回一个状态时,另一个应该添加一个事件。这是一种单向的通信流程,它只发生一次。就像我在典型的夜晚外出时的互动:D
猜你喜欢
  • 2022-01-06
  • 2021-02-14
  • 2022-01-01
  • 2019-12-28
  • 2022-01-25
  • 2021-04-17
  • 2021-02-08
  • 2021-03-19
  • 2017-01-29
相关资源
最近更新 更多