Dart 在我的Flatter应用程序中使用StreamBuilder和Navigator,但第一页会生成两次

Dart 在我的Flatter应用程序中使用StreamBuilder和Navigator,但第一页会生成两次,dart,flutter,Dart,Flutter,伙计们。 我正在使用StreamBuilder处理异步数据 这里是一个演示,在第一页上有一个按钮,单击该按钮将导航到第二页。完整代码如下 导入“包装:颤振/材料.省道”; 导入“dart:async”显示StreamController; void main(){ runApp( 新材料聚丙烯( 标题:“第一页”, 主题:新主题数据( 主样本:颜色。蓝色, ), 主页:新建第一页(), ), ); } 类FirstPage扩展了无状态小部件{ 最终StreamController _Strea

伙计们。 我正在使用StreamBuilder处理异步数据

这里是一个演示,在第一页上有一个按钮,单击该按钮将导航到第二页。完整代码如下

导入“包装:颤振/材料.省道”;
导入“dart:async”显示StreamController;
void main(){
runApp(
新材料聚丙烯(
标题:“第一页”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新建第一页(),
),
);
}
类FirstPage扩展了无状态小部件{
最终StreamController _StreamController=StreamController();
@凌驾
小部件构建(构建上下文){
打印(“第一页开始构建……”);
StreamBuilder=新的StreamBuilder(
流:_streamController.stream,
生成器:(上下文,异步快照){
if(asyncSnapshot.hasData){
打印(“返回的第一页数据……”);
返回上升按钮(
child:Text(“转到第二页”),
已按下:(){
打印(“导航到第二页…………”;
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>SecondPage()),
);
},
);
}否则{
返回文本(“等待更新”);
}
});
归还新脚手架(
appBar:新的appBar(
标题:新文本(“第一页”),
),
正文:专栏(
儿童:[
升起的按钮(
子项:文本(“更新状态”),
已按下:(){
_streamController.add('hello world');
},
),
建设者
],
),
);
}
处置{
_streamController.close();
}
}
类SecondPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
打印(“第二页开始构建……”);
归还新脚手架(
appBar:新的appBar(
标题:新文本(“第二页”),
),
正文:文本(“这是第二页”),
);
}

}
这是预期的行为

一个小部件的构建次数永远不会改变应用程序的行为,它至多是一种性能优化


如果这导致了任何类型的问题,那么您很可能在
build
方法中出错。在这种情况下,您可能希望根据阅读

,它是预期的/normal.hey Rémi,但是如果在转到第二页时重建了第一页小部件,则不会打印为什么>。是的,但这完全是可选的。它不应该改变你的应用程序的行为。在React中,在开发过程中,他们甚至无缘无故地随机调用他们的“构建”等价物,只是为了验证您是否遵循了此规则。但这很奇怪,因为没有调用构建方法(这是预期的),只有流中的内容。@Diegveloper Hi。我的问题和你以前一样。然后我检查了StreamBuilder实现,它扩展了StatefulWidget。当您使用StatefulWidget时,build方法将调用,如果您使用无状态widget,则不会调用。所以,我猜第一个页面构建方法没有调用,因为第一个页面扩展了无状态小部件。StreamBuilder扩展StatefulWidget导致StreamBuilder再次调用。这只是我的猜测,也许是错的。如果你找到原因,请告诉我。谢谢,这与此无关。这是因为对
home
小部件的引用从未改变,因为它是
home:home()
。如果您将其改为使用
路由
,例如
路由:{'/':(上下文)=>Home()}
,那么您就可以重新构建主页了