我正在使用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}}方法在新数据到达时没有被频繁调用,却根本无法用作小部件。
答案 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管道的构建速率。