У меня есть виджет с именем RootContainer
, который получает Widget child
и оборачивает его в StreamBuilder
:
class RootContainer extends StatelessWidget {
final Widget child;
RootContainer({this.child});
@override
Widget build(BuildContext context) {
return StreamBuilder<OverlayAlert>(
stream: ApiService.ThrottledException.stream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
Future.delayed(Duration.zero, () => showAlert(context, snapshot));
}
return this.child;
},
);
}
void showAlert(BuildContext context, snapshot) {
print("showing dialog");
showDialog(
context: context,
builder: (context) => OverlayAlertDialog(snapshot),
);
}
При возникновении ошибки я добавляю новое значение в поток ApiService.exception.stream
, которое запускает построитель StreamBuilder, а затем открывает диалоговое окно.
Это текущее дерево виджетов:
Проблема начинается, когда я хочу открыть навигатор, StreamBuilder.builder
строит снова!
Я подумал, что это может произойти, потому что RootContainer
перестраивается, но размещение print
до StreamBuilder
привело только к одному отпечатку.
Я попытался .listen
к потоку, и поток не сработал, когда я нажал на навигатор, чтобы я мог подтвердить, что нет ничего плохого в ApiService.ThrottledException.stream
.
Снимок при наложении навигатора равен (данным) последнему излучению.
В следующей демонстрации вы можете видеть, что всякий раз, когда я нажимаю кнопку возврата, снова появляется диалоговое окно:
Что может заставить StreamBuilder
перестраиваться при нажатии на кнопку возврата?