Связь между блоками Mutibloc Provider

Я использую flutter_bloc, и мне нужен блок для общения с другим блоком - у меня есть ActivityBloc, которому нужно прослушивать authBloc, чтобы определить, аутентифицирован ли автор, и получить идентификатор пользователя (намерение состоит в том, чтобы начать прослушивание изменений документа в firestore на основе идентификатора пользователя из аутентификации).

Я передаю зависимый объект в блок активности через конструктор.

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();
...
}

Мне нужно, чтобы они были представлены в поставщике мультиблоков, как я могу создать экземпляры блоков в поставщике мультиблоков, где один блок должен быть передан в другой блок?

Спасибо


person user3836415    schedule 28.04.2020    source источник


Ответы (2)


Вы можете использовать экземпляр одного блока в другом блоке, выполнив следующие действия.

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(),
);
person Chinmay Mourya    schedule 02.11.2020

Привет, я не уверен, что это возможно с библиотекой flutter_bloc, но вы можете использовать замечательную библиотеку провайдера https://pub.dev/packages/provider#-installing-tab- одобрен Google (не только для блока)

Кроме того, 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(),
)

а затем получает доступ к любому провайдеру внутри виджета приложения

@override Widget build(BuildContext context) {
final bloc = Provider.of<ActivityBloc>(context);
person Philip Dolenko    schedule 28.04.2020