setState更改流后,StreamBuilder不会重建

时间:2019-08-14 16:45:57

标签: flutter

我有一个StatefulWidget,其中有一个名为stream的变量,它被初始化为初始流:

var stream = stream1;

调用setState时:

setState(() {
 condition ? stream = stream1 : stream = stream2;
});

Thesee流由StreamBuilder使用:

StreamBuilder(
 stream: stream,
 builder: (context, snap) {
  return RaisedButton(
   child: ..
   onPressed: snap.hasData ? () => my_function() : null
  );
 }
)

问题是,当构建器函数通过流获取数据并且按钮变为可单击状态,然后状态发生变化时,如果单击my_function按钮,则第二个流没有数据生效,新的StreamBuilder按钮仍可单击()未执行。

1 个答案:

答案 0 :(得分:0)

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