流(Stream)的StreamBuilder监听和普通的listen方法监听有什么区别?

5

我正在使用 http 库来下载一张图片。

final client = http.Client();
final _response = await client.send(http.Request('GET', Uri.parse("my_url")));

听取方法一:(听取方式)

int downloaded = 0;
_response.stream.listen((value) {
  // this gets called 82 times and I receive actual image size
  downloaded += value.length;
});

听取方式2:(使用StreamBuilder小部件)

int downloaded = 0;
StreamBuilder<List<int>>(
  stream: _response.stream,
  builder: (_, snapshot) {
    // this gets called 11 times and I receive around 1/10 actual image size
    if (snapshot.hasData) downloaded += snapshot.data.length;
    return Container();
  },
);

问题是为什么当新数据到达时,StreamBuilderbuild()方法并没有被频繁调用,这简单地使其作为小部件的目的无效。
1个回答

4
StreamBuilder 能够更好地优化以在每个新快照上不进行重建。正如 StreamBuilder 文档中所述:Widget 重建是通过每次交互(使用State.setState)调度的,但与流的计时无关。生成器由Flutter管道自行决定何时调用,并因此接收表示与流交互的快照的时间相关子序列。例如,当与生成整数0到9的流进行交互时,生成器可以使用包括最后一个快照(具有ConnectionState.done)的任何有序子序列来调用以下快照:new AsyncSnapshot.withData(ConnectionState.waiting, null),new AsyncSnapshot.withData(ConnectionState.active, 0),new AsyncSnapshot.withData(ConnectionState.active, 1)...... new AsyncSnapshot.withData(ConnectionState.active, 9),new AsyncSnapshot.withData(ConnectionState.done, 9)。生成器的实际调用顺序取决于流生成的事件和Flutter管道的构建速率的相对时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接