Flutter:为什么setState((){})一次又一次地设置数据

时间:2020-07-10 21:43:31

标签: flutter dart setstate

我使用setState(() {})为变量分配值。但是它一次又一次地打印。为什么会这样反应?我该如何解决?

这是我的代码:

class Sample extends StatefulWidget {
  @override
  _SampleState createState() => _SampleState();
}

class _SampleState extends State<Sample> {
  String _message;
  String _appLink;
  Firestore db = Firestore.instance;
  @override
  Widget build(BuildContext context) {
    db.collection('share').document('0').get().then((value) {
      var message = value.data['message'];
      print(message);
      var appLink = value.data['appLink'];
      setState(() {
        _message = message;
        _appLink = appLink;
      });
    });
    return Container(
      child: Text('$_message $_appLink'),
    );
  }
}

这是我的输出:

此处_appLink的值为www.facebook.com

enter image description here

1 个答案:

答案 0 :(得分:5)

setState的目的是告诉框架状态中的变量已更改,需要重新构建窗口小部件以反映该更改。因此,调用setState会再次调用build函数,在您的情况下,它会调用您的Future,后者会再次调用setState,并触发build,依此类推。 / p>

要解决此问题,您应该在Future中调用initState,并在准备好数据后使用FutureBuilder来显示数据。

示例:

class _SampleState extends State<Sample> {
  Firestore db = Firestore.instance;
  Future databaseFuture;

  @override
  void initState() {
    databaseFuture = db.collection('share').document('0').get()
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: databaseFuture,
      builder: (context, snapshot) {
        if(!snapshot.hasData) {
          return CircularProgressIndicator();
        }
        var message = snapshot.data.data['message'];
        print(message);
        var appLink = snapshot.data.data['appLink'];
        return Text('$message $appLink');
      }
    ),
  }
}