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

标签 flutter dart setstate

我用 setState(() {})用于为变量赋值。但它一次又一次地打印。为什么会有这样的 react ?我该如何解决?
这是我的代码:

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'),
    );
  }
}

Here is my Output:


这里_appLink值为 www.facebook.com enter image description here

最佳答案

setState的目的|是告诉框架状态中的变量发生了变化,需要重建小部件以反射(reflect)该变化。所以调用setState调用build再次起作用,在您的情况下,这会记忆起您的 Future , 调用 setState再次触发 build等等。
要解决此问题,您应该调用 FutureinitState , 并使用 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');
      }
    ),
  }
}

关于Flutter:为什么 setState(( ) { }) 一次又一次地设置数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62842729/

相关文章:

Flutter - 如何在 Flutter 中从 Phpmyadmin 获取和显示数据

从字符串 Dart MD5

javascript - 每当可选 Prop 发送到子组件时显示错误

React-Native this.setState() 不起作用

macos - Flutter macOS 插件

flutter - 从另一个类调用flutter/dart静态列表或单例对象列表时,始终返回其默认值

android - Flutter:在根项目 'assembleStageDebug' 中找不到任务 'android'

flutter - 如何在子窗口小部件上编辑值

google-maps - 如何在 flutter 中在两个谷歌地图标记之间缩放

javascript - 在 React 中更改成员变量的状态不起作用