由于我是Flutter的新开发人员,这让我很困惑何时应该调用setState()?如果我调用此方法,则整个应用程序都将在build()中重新加载(重画视图)。我想在树小部件结构中更新一个TextView小部件值
答案 0 :(得分:0)
这里是示例。点击fab时,您仅重新创建_MyTextWidget
StreamController<int> _controller = StreamController<int>.broadcast();
int _seconds = 1;
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: Colors.cyan.withOpacity(0.3),
width: 300.0,
height: 200.0,
child: _MyTextWidget(_controller.stream)),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_controller.add(_seconds++);
},
child: Icon(Icons.add),
),
);
}
...
class _MyTextWidget extends StatefulWidget {
_MyTextWidget(this.stream);
final Stream<int> stream;
@override
State<StatefulWidget> createState() => _MyTextWidgetState();
}
class _MyTextWidgetState extends State<_MyTextWidget> {
int secondsToDisplay = 0;
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: widget.stream,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
return snapshot.hasData ? Text(snapshot.data.toString()) : Text('nodata');
});
}
}
答案 1 :(得分:0)
为简单起见,SetState() {}
使调用它的窗口小部件无效,并通过调用build()
强制窗口小部件重建自身。这意味着每个子小部件都将被重建。
还有其他方法可用于将数据传递到树上的小部件,并使其自身使用SetState () {}
进行重建(及其所有子项)。这些确实有用,特别是如果要重建的小部件与小部件树中的部件相距甚远。
其中之一是@ andrey-turkovsky提供的示例,该示例使用StreamBuilder
和Stream
的组合。 StreamBuidler
是一个小部件,当Stream
中存在交互时,它会自行重建。基于此,我们的想法是将TextView
包装在StreamBuilder
中,然后使用流发送您希望TextView
显示的数据。