Flutter - StreamBuilder 构建器函数在导航器弹出时运行

Flutter - StreamBuilder builder function runs when navigator pops

我有一个名为 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 再次构建!

  1. 我认为这可能会发生,因为 RootContainer 正在重建,但是在 StreamBuilder 之前放置一个 print 结果只打印了一个。

  2. 我尝试 .listen 到流,当我弹出导航器时流没有触发,所以我可以确认 ApiService.ThrottledException.stream 没有问题。

  3. 弹出导航器时的快照等于(数据)上次发射。

你可以在下面的演示中看到,每当我按下后退按钮时,对话框再次弹出:

当我按下后退按钮时,什么会导致 StreamBuilder 自行重建?

我不得不更改 RootContainer 以扩展 StatefulWidget 而不是 StatelessWidget

我不知道幕后发生了什么,但它有效!任何解释都会很好。