блоки в шахматном порядке действуют не так, как ожидалось

#flutter #bloc

Вопрос:

У меня есть 2 блока для 2 виджетов, управляющих одной страницей. Родительский блок/виджет ( BlocA ) управляет тем, какой виджет в конечном итоге отображается, дочерний блок/виджет ( BlocB ) управляет фактическим пользовательским интерфейсом.

Я бы предположил , что если я изменю состояние BlocA с событием AInProgress , а затем вернусь к BlocB ALoadSuccess событию с, будут переданы новые данные BlocB и PageB будет отображено новое.

Однако в моем случае AInProgress выполняется, если я выдаю событие BReturn , но оно не достигается PageA (точка останова в if операторах, проверяющих события, не достигнута). Таким образом, моя страница остается такой, какая она есть, никакие новые данные не передаются.

Что я делаю не так и что мне нужно сделать, чтобы восстановить PageB данные с помощью свежих данных BlocA ? Я не могу включить слушателя BlocA BlocB , потому что на самом деле он есть PageC и PageD т. Д. , И BlocA решает, какой из них показывать.

 class BlocA extends Bloc<BlocAEvent, BlocAState> {
...
}
class BlocB extends Bloc<BlocBEvent, BlocBState> {
...
}

class PageA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<BlocA, BlocAState>(
        builder: (context, state) {
          if (state is AInProgress)
            return CircularProgressIndicator();
          else if (state is ALoadSuccess)
            return BlocProvider(
              create: (context) => BlocB(state.counter),
              child: PageB();
            )
          else
            return Text('oops');
        }
    );
  }
}
class PageB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocBuilder<BlocB, BlocBState>(
        builder: (context, state) {
          if (state is BInProgress)
            return CircularProgressIndicator();
          else if (state is BLoadSuccess)
            return Text(state.counter.toString() );
          else if (state is BReturn)
            BlocProvider.of<BlocA>(context).add(ARefresh());
          else
            return Text('oops');
        }
    );
  }
}
 

= = = = = = = = = ОБНОВЛЕНИЕ ======= = =

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

       yield AInProgress();
      await Future.delayed(Duration(seconds: 1)); // <<<<<<<
        cnt;
      yield ALoadSuccess(cnt);