1

我有两个 BLoC。

  • 地产集团
  • 地产尝试集团

我的应用程序基本上从 API 获取资产并以类似的方式显示它们

现在我想添加一个排序功能,但我只能通过特定状态访问庄园列表。

    if(currentState is PostLoadedState){{
    print(currentState.estates);
    }

我想为需要该清单的任何集团提供遗产清单。

我所做的是,我创建了 EstateTryBloc,它基本上包含了作为状态的庄园列表。

class EstateTryBloc extends Bloc<EstateTryEvent, List<Estate>> {
  @override
  List<Estate> get initialState => [];

  @override
  Stream<List<Estate>> mapEventToState(
    EstateTryEvent event,
  ) async* {


    final currentState = state;
    if(event is AddToEstateList){
      final estates = await FetchFromEitherSource(currentState.length, 20)
          .getDataFromEitherSource();
      yield currentState + estates;
    }
  }
}

当我在集团内部打印状态时,我得到了庄园列表,但我不知道如何在不同的集团中使用该列表。

print(EstateTryBloc().state);

仅显示初始状态。

我对各种答案持开放态度,请随时告诉我不同​​的方法是否会更好。

4

3 回答 3

1

当你这样做时,print(EstateTryBloc().state);你正在创建一个新实例,EstateTryBloc()这就是为什么你总是看到initialState而不是当前状态。

为此,您必须访问要获取其状态的实例的引用。就像是:

final EstateTryBloc bloc = EstateTryBloc();

// Use the bloc wherever you want

print(bloc.state);
于 2020-01-31T12:07:08.667 回答
1

现在推荐的在 bloc 之间共享数据的方法是将一个 bloc 注入另一个 bloc 并监听状态变化。所以在你的情况下,它会是这样的:

class EstateTryBloc extends Bloc<EstateTryEvent, List<Estate>> {
  final StreamSubscription _subscription;

  EstateTryBloc(EstateBloc estateBloc) {
    _subscription = estateBloc.listen((PostState state) {
      if (state is PostLoadedState) {
        print(state.estates);
      }
    });
  }

  @override
  Future<Function> close() {
    _subscription.cancel();
    return super.close();
  }
}
于 2020-01-31T11:42:13.450 回答
0

老实说,我把事情复杂化了一点,并没有认识到真正的问题。这是我在按下排序按钮时不小心创建了一个新的 EstateBloc() 实例。不管怎样,谢谢你们的贡献!

于 2020-02-01T15:16:22.193 回答