Flutter 哪个是有效的?Flatter StreamBuilder小部件与带有setState()的Stream.Listen()的比较

Flutter 哪个是有效的?Flatter StreamBuilder小部件与带有setState()的Stream.Listen()的比较,flutter,dart,widget,stream-builder,Flutter,Dart,Widget,Stream Builder,我正在编写持续时间为1秒的周期流以显示时间: stream: Stream.periodic(Duration(seconds: 1)), builder: (context, snapshot) { return Text(DateTime.now().toString()); } 此外,我可以通过以下方式实现同样的目标: Stream.periodic(Duration(seconds: 1)).listen((){ setState(){}); 还有 我想知道哪种方法更有效? 流生

我正在编写持续时间为1秒的周期流以显示时间:

stream: Stream.periodic(Duration(seconds: 1)),
builder: (context, snapshot) {
  return Text(DateTime.now().toString());
}
此外,我可以通过以下方式实现同样的目标:

Stream.periodic(Duration(seconds: 1)).listen((){
setState(){});
还有

我想知道哪种方法更有效?

流生成器每秒返回单个小部件或小部件树。而
setState()
在我的例子中重建整个应用程序小部件树。我在这里感到困惑。请告知。

我认为第一种方法更有效,因为当事件发生时,它只会触发该流的构建


但是,调用
setState()
将重建有状态小部件的整个小部件树。。因此成本更高

setState
不会重建整个应用程序小部件树。您提到的两种方法(StreamBuilder和Stream.listen)都会在出现新事件时重建它们自己及其子体

如果你的整个应用程序都在一个大的
build
方法下,那么yes
setState
将触发它所使用的任何
build
方法的重建。如果是这种情况,出于性能原因,您应该拆分代码

您的用例实际上在本文中提到

将状态推到左边。例如,如果您的页面有一个滴答作响的时钟,而不是将状态放在页面顶部,并在每次时钟滴答作响时重建整个页面,那么创建一个只更新自身的专用时钟小部件


此外,您可以随时利用来测量任何性能差异。

是否有更精确的答案?@pskink现在似乎提出了在
StreamBuilder
内部使用
StatefulBuilder
的问题,StreamBuilder将每秒返回StatefulBuilder。还有,为什么我们需要设置每秒的状态,因为我已经在StreamBuilder的范围内设置了这些
字段。无论如何。开放讨论。我不想回避它,但对这两种方法的性能感到好奇,在我的特殊情况下(
StreamBuilder
vs
Stream.listen(setState(){})
)@ambiguous58在下面指出了一些有用的提示。我认为这并不准确,因为OP提到的两种方法(StreamBuilder和Stream.listen)在出现新事件时都会重建它们自己及其子体。是的,在第一种情况下会重建StreamBuilder的子体,但在第二种情况下会调用setState()将重建整个小部件树,甚至在需要重建的小部件上方。
setState
仅重建它所使用的
build
方法。因此,如果整个应用程序都在一个大的
build
方法下,那么它将被重建*抖动*是的,这正是我的意思,如果列中可能有多个流生成器,那么最好使用第一个方法,因为它将根据其状态构建每个流生成器。因此,在这种情况下,使用
StreamBuilder
似乎相当于
专用时钟小部件
。正确的?