【问题标题】:BlocBuilder's build method is not invoked when adding an event to this bloc from inside another bloc从另一个 bloc 内部向该 bloc 添加事件时不调用 BlocBuilder 的 build 方法
【发布时间】:2023-03-15 02:54:01
【问题描述】:

我有bloc A,在我的应用程序的所有小部件上创建和提供。

我有Bloc B,在screen 1 中创建和提供。

Bloc B 具有对Bloc A 的引用,并且可以在mapEventToStateBloc B 内的Bloc A 中添加事件。

现在奇怪的是:

在屏幕 1 内,我有一个 BlocBuilderBloc A

如果我直接添加事件(blocAReference.add(blockAEvent) BlocBuilder 在状态改变时被调用),

但是,当我将事件间接添加到 Bloc AblocBrefrence.add(blockBEvent) 然后在 Bloc BmapEventToState 中添加事件到 Bloc A)时,BlocBuilder 不会被调用(但我可以保证通过printing 向控制台表明事件已添加到Bloc A)

我正在使用flutter_bloc 库。

【问题讨论】:

    标签: flutter dependency-injection lazy-evaluation flutter-bloc injectable


    【解决方案1】:

    我知道出了什么问题。

    逻辑都很好,除了一件事,我正在使用injectable库来管理依赖关系,

    我将Bloc A 注释为@Injectable()

    所以当库想要将Bloc A 注入Bloc B 的构造函数时,

    它每次都创建一个Bloc A 的新实例,并且该实例与我在BlocBuilder 中收听的实例不同(我正在收听的是在小部件树顶部提供的实例,我正在使用context.bloc<BlocA>() 查找它 )

    所以有两种解决方案:

    1. 我在Bloc A 上保留@Injectable() 注释,但现在我没有将Bloc A 注入Bloc B,而是发送Bloc A 的实例,并将每个事件添加到Bloc B(即作为函数参数)
    2. 我从Bloc A 中删除@Injectable() 注释并用@LazySingleton 替换它,这样所有使用context.bloc<BlocA>() 的查找将使injectable 库给我相同的Bloc A 实例,这是我首先创建的小部件

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2020-12-06
      • 2021-04-20
      • 2020-08-08
      • 2021-03-19
      • 2019-12-28
      • 2019-05-23
      • 2021-03-01
      • 2021-02-05
      相关资源
      最近更新 更多