Flutter - функция построителя StreamBuilder запускается при появлении навигатора - PullRequest
1 голос
/ 27 июня 2019

У меня есть виджет с именем 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, а затем открывает диалоговое окно.

Это текущее дерево виджетов:

enter image description here

Проблема начинается, когда я хочу открыть навигатор, StreamBuilder.builder строит снова!

  1. Я подумал, что это может произойти, потому что RootContainer перестраивается, но размещение print до StreamBuilder привело только к одному отпечатку.

  2. Я попытался .listen к потоку, и поток не сработал, когда я нажал на навигатор, чтобы я мог подтвердить, что нет ничего плохого в ApiService.ThrottledException.stream.

  3. Снимок при наложении навигатора равен (данным) последнему излучению.

В следующей демонстрации вы можете видеть, что всякий раз, когда я нажимаю кнопку возврата, снова появляется диалоговое окно:

enter image description here

Что может заставить StreamBuilder перестраиваться при нажатии на кнопку возврата?

1 Ответ

1 голос
/ 01 июля 2019

Мне пришлось изменить RootContainer, чтобы расширить StatefulWidget вместо StatelessWidget.

Понятия не имею, что происходит за сценой, но это работает! Любое объяснение было бы неплохо.

...