Bloc与Bloc通信Mutibloc提供程序

时间:2020-04-28 20:26:21

标签: flutter flutter-bloc

我使用的是flutter_bloc,我需要一个与另一个块一起communicate的块-我有一个activityBloc,需要监听authBloc以确定作者是否已通过身份验证并获取用户ID(目的是为了开始根据身份验证的用户ID监听Firestore上的文档更改)。

我正在通过构造函数将依赖对象传递给activityBloc。

class ActivityBloc extends Bloc<ActivityEvent, ActivityState> {
  final AuthBloc authBloc;
  final ActivityRepository repo;
  StreamSubscription authSubscription;
  StreamSubscription activitySubscription;
  String id; // userid
  int limit = 10;

  ActivityBloc({this.authBloc, this.repo}) {
    id = "";

    authSubscription = authBloc.listen((state) {
      if (state is AuthenticatedState) {
        id = state.user.uid;
        ...
          });
        });
      }
    });
  }

  @override
  ActivityState get initialState => ActivityInitial();
...
}

我需要将这些暴露给多块提供程序,我如何在多块提供程序中实例化需要将一个块传递给另一个块的块?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式将一个集团的实例用于另一个集团。

return MultiBlocProvider(
  providers: [
    BlocProvider<AuthBloc>(
      create: (BuildContext context) => AuthBloc(),
    ),
    BlocProvider<ActivityBloc>(
      create: (BuildContext context) => ActivityBloc(
        authBloc: BlocProvider.of<AuthBloc>(context),
        repo: /// instance of your activity repository,
      ),
    ),
  ],
  child: App(),
);

答案 1 :(得分:-1)

嗨,我不确定flutter_bloc库是否可行,但是您可以使用很棒的提供程序库 https://pub.dev/packages/provider#-installing-tab- 已获得Google的批准(不仅适用于欧盟)

另外,flutter_bloc也正在使用提供程序

有ProxyProvider,我不确定为flutter_bloc库提供什么特权,因为没有它,您需要做的所有事情,就我而言,我仅使用提供程序库

以下代码可解决您的问题,有关如何与提供商合作的更多信息,请查看https://pub.dev/packages/provider

MultiProvider(
  providers: [
    Provider<AuthBloc>(
      create: (_) => AuthBloc(),
      dispose: (_, bloc) => bloc.dispose(),
    ),
    ProxyProvider<AuthBloc,ActivityBloc>(
    create: (_) => ActivityBloc(),
    update: (_, authBloc, bloc) => bloc..authBloc = authBloc, //insert authBloc to ActivityBloc
    dispose: (_, bloc) => bloc.dispose(),
    ),
  )
  ],
  child: App(),
)

然后访问App小部件内的任何提供商

@override Widget build(BuildContext context) {
final bloc = Provider.of<ActivityBloc>(context);