【问题标题】:How to access data in Bloc's state from another bloc如何从另一个 bloc 访问 Bloc 状态的数据
【发布时间】:2021-02-05 11:36:35
【问题描述】:

我正在使用 Bloc 模式开发 Flutter 应用程序。认证成功后,UserSate 有 User 对象。在所有其他 Bloc 中,我需要访问 UserState 中的用户对象。我尝试在其他 Bloc 的构造函数参数上获取 UserBloc 并访问 User 对象。但它表明用户对象为空。谁有更好的解决方案?

class SectorHomeBloc extends Bloc<SectorHomeEvent, SectorHomeState> {
  final OutletRepository outletRepository;
  UserBloc userBloc;
  final ProductRepository productRepository;
  final ProductSubCategoryRepository productSubCategoryRepository;
  final PromotionRepository promotionRepository;
  final ProductMainCategoryRepository mainCategoryRepository;

  SectorHomeBloc({
    @required this.outletRepository,
    @required this.userBloc,
    @required this.productSubCategoryRepository,
    @required this.productRepository,
    @required this.promotionRepository,
    @required this.mainCategoryRepository,
  });
  @override
  SectorHomeState get initialState => SectorHomeLoadingState();

  @override
  Stream<SectorHomeState> mapEventToState(SectorHomeEvent event) async* {
    try {
      print(userBloc.state.toString());
      LatLng _location = LatLng(
          userBloc.state.user.defaultLocation.coordinate.latitude,
          userBloc.state.user.defaultLocation.coordinate.longitude);
      String _token = userBloc.state.user.token;

      if (event is GetAllDataEvent) {
        yield SectorHomeLoadingState();
        List<Outlet> _previousOrderedOutlets =
            await outletRepository.getPreviousOrderedOutlets(
                _token, _location, event.orderType, event.sectorId);

        List<Outlet> _featuredOutlets =
            await outletRepository.getFeaturedOutlets(
                _token, _location, event.orderType, event.sectorId);
        List<Outlet> _nearestOutlets = await outletRepository.getOutletsNearYou(
            _token, _location, event.orderType, event.sectorId);

        List<Product> _newProducts = await productRepository.getNewItems(
            _token, _location, event.orderType, event.sectorId);

        List<Product> _trendingProducts =
            await productRepository.getTrendingItems(
                _token, _location, event.orderType, event.sectorId);

        List<Promotion> _promotions = await promotionRepository
            .getVendorPromotions(_token, event.sectorId);
        yield SectorHomeState(
          previousOrderedOutlets: _previousOrderedOutlets,
          featuredOutlets: _featuredOutlets,
          nearByOutlets: _nearestOutlets,
          newItems: _newProducts,
          trendingItems: _trendingProducts,
          promotions: _promotions,
        );
      }
    } on SocketException {
      yield SectorHomeLoadingErrorState('could not connect to server');
    } catch (e) {
      print(e);
      yield SectorHomeLoadingErrorState('Error');
    }
  }
}

mapEventToState 方法中的打印语句 [print(userBloc.state.toString());] 显示了 UserSate 的初始状态。 但是,在执行此代码时,UserState 处于 UserLoggedInState 中。

【问题讨论】:

  • 实际上您是在尝试从另一个类访问一个类属性对吗?
  • 首先在事件'GetAllDataEvent'类中定义用户对象成员变量。并在加载 UserBloc 的状态下通过 calingl 'add(GetAllDataEvent(user: userObj))' 传递用户对象。并通过在 'if (event is GetAllDataEvent)' 中调用 'event.user' 来获取用户对象
  • 非常感谢。它的工作。但是还有另一种官方方式可以在集团之间进行交流。顺便说一句,非常感谢

标签: flutter flutter-bloc


【解决方案1】:

在文档中有一种官方方法可以做到这一点,称为Bloc-to-Bloc Communication 这是文档中的示例

class MyBloc extends Bloc {
  final OtherBloc otherBloc;
  StreamSubscription otherBlocSubscription;

  MyBloc(this.otherBloc) {
    otherBlocSubscription = otherBloc.listen((state) {
        // React to state changes here.
        // Add events here to trigger changes in MyBloc.
    });
  }

  @override
  Future<void> close() {
    otherBlocSubscription.cancel();
    return super.close();
  }
}

【讨论】:

  • 最欢迎的朋友!
猜你喜欢
  • 2021-06-22
  • 2023-01-17
  • 2020-05-06
  • 2022-01-25
  • 2020-03-26
  • 2019-06-13
  • 2021-07-22
  • 2021-03-19
  • 2019-05-23
相关资源
最近更新 更多