首页 > 解决方案 > 在 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() ,第二个流实际上没有数据'没有被执行。

标签: flutter

解决方案


问题实际上不是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

推荐阅读