flutter - 在 setState 更改流后 StreamBuilder 不会重建
问题描述
我有一个 StatefulWidget,其中有一个名为 stream 的变量,它被初始化为一个初始流:
var stream = stream1;
当调用 setState 时:
setState(() {
condition ? stream = stream1 : stream = stream2;
});
StreamBuilder 使用这些流:
StreamBuilder(
stream: stream,
builder: (context, snap) {
return RaisedButton(
child: ..
onPressed: snap.hasData ? () => my_function() : null
);
}
)
问题是,当构建器函数通过流获取数据并且按钮变为可单击然后状态发生更改时,新的 StreamBuilder 按钮仍然可单击,尽管如果单击按钮 my_function() ,第二个流实际上没有数据'没有被执行。
解决方案
问题实际上不是StreamBuilder
没有重建,而是它保留了最后一个发出的事件。
因此,您不能简单地检查snapshot.hasData
. 你也必须检查snapshot.connectionState
。
当StreamBuilder
接收到一个新的流时,snapshot.connectionState
将重置为ConnectionState.waiting
直到至少一个值被发出。
所以而不是:
onPressed: snap.hasData ? () => my_function() : null
你可以做:
onPressed: snap.connectionState != ConnectionState.waiting && snap.hasData ? () => my_function() : null
推荐阅读
- flutter - Flutter:我需要使小部件可滚动,以便每当我使用列表视图滚动时,它们都会跟随
- google-data-studio - 为什么我会在 URL 点击报告中获得 0 次点击的查询?
- arrays - 如何将我上传的文件转换为 json
- sql - 将返回以逗号分隔的结果的 SQL 查询
- python - 在python中循环链表的开头插入
- linux - ubuntu上find命令的奇怪问题
- azure - 从多区域帐户中的特定日期/时间读取更改提要
- azure-logic-apps - 将 SQL 连接器添加到逻辑应用的 BadGateway 异常
- if-statement - Github Pages:在 index.html 中添加 if 条件
- amazon-web-services - AWS AppStream 2.0 持久存储不起作用