#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);