Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振-当导航器弹出时,StreamBuilder函数运行_Flutter_Dart_Stream Builder - Fatal编程技术网

Flutter 颤振-当导航器弹出时,StreamBuilder函数运行

Flutter 颤振-当导航器弹出时,StreamBuilder函数运行,flutter,dart,stream-builder,Flutter,Dart,Stream Builder,我有一个名为RootContainer的小部件,它接收一个widget子部件,并将其包装在一个StreamBuilder中: class RootContainer extends StatelessWidget { final Widget child; RootContainer({this.child}); @override Widget build(BuildContext context) { return StreamBuilder<Overlay

我有一个名为
RootContainer
的小部件,它接收一个
widget子部件
,并将其包装在一个
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),
    );
  }
类RootContainer扩展了无状态小部件{
最后一个孩子;
根容器({this.child});
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:ApiService.ThrottledException.stream,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.active){
Future.delayed(Duration.zero,()=>showAlert(上下文,快照));
}
归还这个孩子;
},
);
}
void showAlert(构建上下文、快照){
打印(“显示对话框”);
显示对话框(
上下文:上下文,
生成器:(上下文)=>OverlayAlertDialog(快照),
);
}
当发生错误时,我会向流
ApiService.exception.stream
添加一个新值,它会触发StreamBuilder,然后打开一个对话框

这是当前小部件树:

当我想弹出导航器时,问题就开始了,
StreamBuilder.builder
会再次构建

  • 我认为这可能是因为正在重建
    RootContainer
    ,但是在
    StreamBuilder
    之前放置
    print
    只会导致一次打印

  • 我尝试了
    。收听
    流,但当我弹出导航器时,流没有启动,因此我可以确认
    ApiService.throttledeexception.stream
    没有问题

  • 弹出导航器时的快照与最后一次发射相等(数据)

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


    当我按下后退按钮时,
    StreamBuilder
    会自动重建吗?

    我必须更改
    RootContainer
    以扩展
    StatefulWidget
    ,而不是
    无状态widget


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

    你的问题有什么进展吗?我在这里发布了一个类似的问题: