flutter - Flutter Bloc 依赖项的多个监听器 - 接收先前的状态

这是我的 Flutter 应用 MultiBlocProvider 设置;

MultiBlocProvider(
      providers: [
        BlocProvider<LocationBloc>(create: (BuildContext context) {
          return LocationBloc();
        }),

        BlocProvider<AddressBloc>(create: (BuildContext context) {
          return AddressBloc(
              location: BlocProvider.of<LocationBloc>(context)
                ..add(LocationStarted()))
            ..add(AddressStarted());
        }),

        BlocProvider<CampaignBloc>(
          create: (BuildContext context) => CampaignBloc(
              addressBloc: BlocProvider.of<AddressBloc>(context),
              repo: CampaignsRepository())
            ..add(CampaignsInitial()),
        ),

        BlocProvider<BusinessBloc>(
          create: (BuildContext context) => BusinessBloc(
              addressBloc: BlocProvider.of<AddressBloc>(context),
              repo: BusinessRepository())
            ..add(BusinessInitial()),
        )
      ],
      child: MaterialApp(...)
          ,
    )

LocationBloc 从位置服务获取位置。 AddressBloc 从 LocationBloc 获取更新的位置并将其转换为地址。

CampaignBloc 在其构造函数中监听 AddressBloc 流以了解地址(位置)的变化,并针对已更改的位置发出事件。

CampaignBloc({required this.repo, required this.addressBloc})
      : super(CampaignState()) {
    _addressSubscription =
        addressBloc.stream.asBroadcastStream().listen((AddressState state) {
      if (state is AddressLoadSuccess) {
        Location location = state.location;

        add(CampaignChangedLocation(location: location));
      }
    });
  }

BusinessBloc 在其构造函数中做同样的事情,并且(应该)为更改后的位置发出业务。

 BusinessBloc({required this.repo, required this.addressBloc})
      : super(BusinessInitial()) {
    _addressSubscription =
        addressBloc.stream.asBroadcastStream().listen((AddressState state) {
      if (state is AddressLoadSuccess) {
        Location location = state.location;

        add(BusinessChangedLocation(location: location));
      }
    });
  }

HomeView 有一个构建事件列表的 BlocBuilder

AlliesView 有一个 BlocBuilder 来构建企业列表。

CampaignBloc 在构建 HomeView 时正在接收更新的位置,但在转换到 AlliesView 时,AddressBloc 流上的监听器没有接收到更新的位置,因为它在事件后订阅了流。如何在 AddressBloc 流的后续监听器中获取更新后的位置?

最佳答案

MultiBlocListener(
  listeners: [
    BlocListener<BlocA, BlocAState>(
      listener: (context, state) {},
    ),
    BlocListener<BlocB, BlocBState>(
      listener: (context, state) {},
    ),
    BlocListener<BlocC, BlocCState>(
      listener: (context, state) {},
    ),
  ],
  child: ChildA(),
)

https://stackoverflow.com/questions/67394213/

相关文章:

javascript - 获取具有类的下一个元素(不是子元素或兄弟元素)

json - 用 jq 替换字符串

python - 字符串到 python 中的数组 (boto3)

javascript - 如何使具有 map 功能的 3 列网格使用react

mongodb - 使用 GridFS 在 MongoDB 中存储图像是否有效?

java - 就线程或不同请求而言,Spring 的 SecurityContext 行为是什么?

javascript - 这些 ES6 import 语句之间有什么区别?

java - 正则表达式仅包含数字且不包含仅 0

c# - 如何使用c#拆分字符串

r - 如何通过匹配另一个数据框中的整个列中的字符串来检索一个数据框中的值?