Флаттер, используя блок c в блоке - PullRequest
1 голос
/ 31 января 2020

У меня есть два BLoC.

  • EstateBlo c
  • EstateTryBlo c

Мое приложение в основном получает объекты из API и отображает их аналогично fashion

Теперь я хотел добавить функцию сортировки, но я мог получить доступ к списку объектов только через указанное состояние c.

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

Я хотел сделать список поместья доступным для того, кому нужен blo c, который нуждался в этом списке.

То, что я сделал, я создал EstateTryBlo c, который в основном содержит список состояний в качестве состояния.

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;
    }
  }
}

Когда я печатаю состояние внутри блока c, я получаю Список состояний, но я не знаю, как бы я использовал этот Список в другом блоке c.

print(EstateTryBloc().state);

просто показывает initialState.

Я открыт для любого ответа, не стесняйтесь говорить мне, будет ли другой подход лучше.

Ответы [ 3 ]

1 голос
/ 31 января 2020

Когда вы делаете print(EstateTryBloc().state);, вы создаете новый экземпляр EstateTryBloc(), поэтому вы всегда видите initialState вместо текущего состояния.

Чтобы это работало , вы должны получить доступ к ссылке для экземпляра, который вы хотите получить состояния. Что-то вроде:

final EstateTryBloc bloc = EstateTryBloc();

// Use the bloc wherever you want

print(bloc.state);
1 голос
/ 31 января 2020

В настоящее время рекомендуемый способ обмена данными между блоками - это вставить один блок c в другой и прослушать изменения состояния. Так что в вашем случае это будет примерно так:

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();
  }
}
0 голосов
/ 01 февраля 2020

Честно говоря, я немного усложнил ситуацию и не осознал реальной проблемы. Это было то, что я случайно создал новый экземпляр EstateBlo c () всякий раз, когда я нажимал на кнопку сортировки. В любом случае, спасибо за ваш вклад, ребята!

...