首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤动Cubit,监听其他Cubit状态

颤动Cubit,监听其他Cubit状态
EN

Stack Overflow用户
提问于 2021-06-19 22:12:03
回答 1查看 674关注 0票数 1

我试图实现一个监听LocationTrackerCubit和EventLoaderCubit状态的FilterEventCubit。我使用了来自Felix Angelov (https://bloclibrary.dev/#/fluttertodostutorial)的教程作为模板:

代码语言:javascript
复制
class EventFilterCubit extends Cubit<EventFilterState> {
  final EventLoaderCubit eventLoaderCubit;
  final UserCubit userCubit;
  final LocationTrackerCubit locationTrackerCubit;
  StreamSubscription? eventsSubscription;
  StreamSubscription? locationSubscription;

  EventFilterCubit(
      this.eventLoaderCubit, this.userCubit, this.locationTrackerCubit)
      : super(
          eventLoaderCubit.state is EventsUpToDate &&
                  userCubit.state is UserUpToDate &&
                  // TODO: not working correctly
                  locationTrackerCubit.state is LocationLoadSuccess
              ? EventFilterState.filteredEventsLoadSuccess(
                  (eventLoaderCubit.state as EventsUpToDate).events,
                  EventFilter.initial(
                    LatLng(
                      (locationTrackerCubit.state as LocationLoadSuccess)
                          .location
                          .latitude,
                      (locationTrackerCubit.state as LocationLoadSuccess)
                          .location
                          .longitude,
                    ),
                  ),
                )
              : const EventFilterState.filteredEventsLoadInProgress(),
        ) {
    eventsSubscription = eventLoaderCubit.stream.listen(
      (state) {
        if (state is EventsUpToDate) {
          print("Eventloaderbloc updated events");
          eventsUpdated((eventLoaderCubit.state as EventsUpToDate).events);
        }
      },
    );
    locationSubscription = locationTrackerCubit.stream.listen(
      (state) {
        if (state is LocationLoadSuccess) {
          print("locationtrackercubit updated location");
          locationUpdated(
            (locationTrackerCubit.state as LocationLoadSuccess).location,
          );
        }
      },
    );
  }

然后,EventFilterCubit构建包含所有事件的提要。当我构建应用程序或执行热重启时,一切工作正常。但它在第一次状态更新后停止侦听,因此任何时候添加新事件或重新加载事件时,UI中都不会发生任何事情,也不会触发updateEvents函数。这也是我的EventLoaderCubit:

代码语言:javascript
复制
part 'event_loader_cubit.freezed.dart';
part 'event_loader_state.dart';

@injectable
class EventLoaderCubit extends Cubit<EventLoaderState> {
  final IEventRepository eventRepository;

  // TODO: Streams atm useless
  final StreamController<List<Event>> _eventController =
      StreamController<List<Event>>();
  Stream<List<Event>> get eventStream => _eventController.stream;

  EventLoaderCubit(this.eventRepository)
      : super(
          const EventLoaderState.loadInProgress(),
        ) {
    refreshEvents();
  }

  Future<void> refreshEvents() async {
    print("refresh events");
    emit(const EventLoaderState.loadInProgress());
    final eventsFailOrSuccess = await eventRepository.loadEvents();
    eventsFailOrSuccess.fold(
      (failure) => emit(
        const EventLoaderState.loadFailure(
          EventFailure.serverError(),
        ),
      ),
      (events) {
        _eventController.add(events);
        // getIt<EventFilterCubit>().eventsUpdated(events);
        emit(
          EventLoaderState.eventsUpToDate(events),
        );
      },
    );
  }
}

和提供程序初始化:

代码语言:javascript
复制
child: BlocProvider(
        create: (context) => getIt<AuthCubit>()..initialized(),
        child: BlocBuilder<AuthCubit, AuthState>(
          builder: (context, state) {
            if (state is Authenticated) {
              return MultiBlocProvider(
                providers: [
                  BlocProvider<LocationTrackerCubit>(
                    create: (context) => getIt<LocationTrackerCubit>(),
                  ),
                  BlocProvider<UserCubit>(
                    create: (context) => getIt<UserCubit>(),
                  ),
                  BlocProvider<EventLoaderCubit>(
                    create: (context) =>
                        // TODO: Doesn't execute refreshEvents()
                        getIt<EventLoaderCubit>(),
                  ),
                  BlocProvider<EventFilterCubit>(
                    create: (context) => getIt<EventFilterCubit>(),
                  ),
                ],
                child: _materialApp(context, authedRouter),

此外,正如在代码中所写的那样,当注入Cubit时,refreshEvents()函数不会运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-25 22:55:44

我在getIt依赖注入和块方面也遇到了麻烦。我通过更改块对context.read的访问解决了这个问题,现在它工作得很好。

您可以尝试如下所示:

代码语言:javascript
复制
return MultiBlocProvider(
  providers: [
    BlocProvider<UserCubit>(
      lazy: false,
      create: (context) => UserCubit(
        getIt<IUserRepository>(),
      ),
    ),
    BlocProvider<LocationTrackerCubit>(
      lazy: false,
      create: (context) => LocationTrackerCubit(),
    ),
    BlocProvider<EventLoaderCubit>(
      lazy: false,
      create: (context) => EventLoaderCubit(
        getIt<IEventRepository>(),
      ),
    ),
    BlocProvider<EventFilterCubit>(
      create: (context) => EventFilterCubit(
        eventLoaderCubit:
            BlocProvider.of<EventLoaderCubit>(context),
        userCubit: BlocProvider.of<UserCubit>(context),
        locationTrackerCubit:
            BlocProvider.of<LocationTrackerCubit>(context),
      ),
    ),
  ],
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68047583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档