我有一个名为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构建器,然后打开一个对话框。

这是当前的小部件树:

flutter - Flutter-弹出导航器时运行StreamBuilder构建器功能-LMLPHP

当我想弹出导航器时,问题就开始了,StreamBuilder.builder再次生成了!
  • 我以为可能会发生,因为正在重建RootContainer,但是在print之前放置一个StreamBuilder只会打印一张。
  • 我尝试将.listen添加到流中,并且当我弹出导航器时,流没有触发,因此我可以确认ApiService.ThrottledException.stream没有问题。
  • 弹出导航器时的快照(数据)等于上一个发射的快照。

  • 您可以在以下演示中看到,每当我按下“后退”按钮时,对话框就会再次弹出:

    flutter - Flutter-弹出导航器时运行StreamBuilder构建器功能-LMLPHP

    当我按下“后退”按钮时,什么可能导致StreamBuilder自身重建?

    最佳答案

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

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

    关于flutter - Flutter-弹出导航器时运行StreamBuilder构建器功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56782005/

    10-12 04:23