StreamBuilder监听流与常规监听方法之间的区别

时间:2020-04-03 21:14:25

标签: flutter dart

我正在使用EXC_BAD_ACCESS 库来下载图像。

http

收听方式1 :(收听方法)

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

收听方式2:(StreamBuilder小部件)

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

问题是,为什么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(); }, ); 的{​​{1}}方法在新数据到达时没有被频繁调用,却根本无法用作小部件。

1 个答案:

答案 0 :(得分:2)

StreamBuilder基本上经过了优化,不会在每个新快照上重建。正如StreamBuilder documentation所述:

小部件重建是通过每次交互使用 State.setState,但在其他方面与 流。 Flutter决定是否召集建造者 流水线,因此将接收与时间有关的子序列 代表与流交互的快照。

例如,当与产生整数0的流进行交互时 到9,可以使用以下任何有序子序列来调用构建器 以下快照包括最后一个快照( ConnectionState.done):

  • new AsyncSnapshot<int>.withData(ConnectionState.waiting, null)
  • new AsyncSnapshot<int>.withData(ConnectionState.active, 0)
  • new AsyncSnapshot<int>.withData(ConnectionState.active, 1)
  • ...
  • new AsyncSnapshot<int>.withData(ConnectionState.active, 9)
  • new AsyncSnapshot<int>.withData(ConnectionState.done, 9)

构建器的实际调用顺序取决于流产生的事件的相对时间以及Flutter管道的构建速率。