Bloc to Bloc Communication Mutibloc Provider

use*_*415 2 flutter flutter-bloc

我正在使用 flutter_bloc 并且我需要一个 bloc与另一个bloc 进行通信- 我有一个 activityBloc 需要侦听 authBloc 以确定作者是否已通过身份验证并获取用户 ID(目的是开始侦听 firestore 上的文档更改基于来自身份验证的用户 ID)。

我通过构造函数将依赖对象传递给 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();
...
}
Run Code Online (Sandbox Code Playgroud)

我需要在 multibloc 提供程序中公开这些内容,如何在需要将一个 bloc 传递到另一个 bloc 的 mulitbloc 提供程序中实例化 bloc ?

谢谢

Chi*_*rya 5

您可以按照以下步骤将一个 bloc 的实例用于另一个 bloc。

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(),
);
Run Code Online (Sandbox Code Playgroud)


Phi*_*nko -2

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

另外,flutter_bloc 也在使用 Provider

有 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(),
)
Run Code Online (Sandbox Code Playgroud)

然后访问应用程序小部件内的任何提供程序

@override Widget build(BuildContext context) {
final bloc = Provider.of<ActivityBloc>(context);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1908 次

最近记录:

5 年 前