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

Abi*_*san 2 setstate dart flutter

我用于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'),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

这里的_appLink价值是www.facebook.com

在此处输入图片说明

Chr*_*ore 6

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

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

例子:

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');
      }
    ),
  }
}
Run Code Online (Sandbox Code Playgroud)