Flutter setState()方法调用

时间:2018-11-09 07:20:11

标签: android flutter

由于我是Flutter的新开发人员,这让我很困惑何时应该调用setState()?如果我调用此方法,则整个应用程序都将在build()中重新加载(重画视图)。我想在树小部件结构中更新一个TextView小部件值

2 个答案:

答案 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提供的示例,该示例使用StreamBuilderStream的组合。 StreamBuidler是一个小部件,当Stream中存在交互时,它会自行重建。基于此,我们的想法是将TextView包装在StreamBuilder中,然后使用流发送您希望TextView显示的数据。