Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 颤振当我从未来函数收到值时,我的UI不会更新_Firebase_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Firebase 颤振当我从未来函数收到值时,我的UI不会更新

Firebase 颤振当我从未来函数收到值时,我的UI不会更新,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我的问题是,当我从Firestore接收信息时,我会在控制台中看到它打印出来,但我的UI不会更新。但直到我按下再次显示屏幕的图标。底部导航栏中包含我的小部件列表的屏幕 我希望代码中出现的情况是,当我选择底部导航栏中包含屏幕的选项卡时,小部件列表将显示DocumentID的名称。那么,目前我必须再次选择选项卡,以便它们出现 我附上我的密码 class PruebasVarias extends StatefulWidget { @override _PruebasVariasState c

我的问题是,当我从Firestore接收信息时,我会在控制台中看到它打印出来,但我的UI不会更新。但直到我按下再次显示屏幕的图标。底部导航栏中包含我的小部件列表的屏幕

我希望代码中出现的情况是,当我选择底部导航栏中包含屏幕的选项卡时,小部件列表将显示DocumentID的名称。那么,目前我必须再次选择选项卡,以便它们出现

我附上我的密码

class PruebasVarias extends StatefulWidget {
  @override
  _PruebasVariasState createState() => _PruebasVariasState();
}

class _PruebasVariasState extends State<PruebasVarias> {


  List<String> myData        = [];
  List<Widget> myListWidget  = [];

  @override
  void initState() { 
    super.initState();
    getallDocument();
  }

  Future getallDocument()async{
    final QuerySnapshot result = await Firestore.instance
                                      .collection("Users")
                                      .getDocuments();
    final List<DocumentSnapshot> documentos = result.documents;
    documentos.forEach((data) {
      myData.add(data.documentID);
      print(myData);
    });

    for (int i = 0; i < (myData.length); i++){
      myListWidget.add(Text("${myData[i]}"));
    } 
  }

  @override
  Widget build(BuildContext context) {
    return  Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.red,
        title: Text("Documents"),
        actions: <Widget>[
        ],
      ),
      body: Center(
        child: 
        Column(children: myListWidget),
      )
    );
  }
}
类PruebasVarias扩展StatefulWidget{
@凌驾
_PruebasVariasState createState()=>\u PruebasVariasState();
}
类_PruebasVariasState扩展状态{
列出myData=[];
列表myListWidget=[];
@凌驾
void initState(){
super.initState();
getallDocument();
}
Future getallDocument()异步{
最终QuerySnapshot结果=等待Firestore.instance
.收集(“用户”)
.getDocuments();
最终列表文件OS=结果文件;
documentos.forEach((数据){
myData.add(data.documentID);
打印(myData);
});
对于(int i=0;i<(myData.length);i++){
添加(文本(“${myData[i]}”);
} 
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:Colors.red,
标题:文本(“文件”),
行动:[
],
),
正文:中(
儿童:
列(子项:myListWidget),
)
);
}
}

您可以通过调用
setState((){})
方法来解决这个问题;设定状态 通知框架此对象的内部状态已更改

  Future getallDocument() async {
    final QuerySnapshot result =
        await Firestore.instance.collection("Users").getDocuments();
    final List<DocumentSnapshot> documentos = result.documents;
    documentos.forEach((data) {
      myData.add(data.documentID);
      print(myData);
    });

    for (int i = 0; i < (myData.length); i++) {
      myListWidget.add(Text("${myData[i]}"));
    }
    setState(() {});
  }
Future getallDocument()异步{
最终QuerySnapshot结果=
等待Firestore.instance.collection(“用户”).getDocuments();
最终列表文件OS=结果文件;
documentos.forEach((数据){
myData.add(data.documentID);
打印(myData);
});
对于(int i=0;i<(myData.length);i++){
添加(文本(“${myData[i]}”);
}
setState((){});
}

一个简单的修复方法:使用
然后
调用回调函数,在回调函数内部使用
设置状态
更新UI

class PruebasVarias extends StatefulWidget {
  @override
  _PruebasVariasState createState() => _PruebasVariasState();
}

class _PruebasVariasState extends State<PruebasVarias> {


  List<String> myData        = [];
  List<Widget> myListWidget  = [];

  @override
  void initState() { 
    super.initState();
    getallDocument().then(()=>updateUI()).catchError((error)=>print(error));
  }

  Future<void> getallDocument()async{
    final QuerySnapshot result = await Firestore.instance
                                      .collection("Users")
                                      .getDocuments();
    final List<DocumentSnapshot> documentos = result.documents;
    documentos.forEach((data) {
      myData.add(data.documentID);
      print(myData);
    });

    for (int i = 0; i < (myData.length); i++){
      myListWidget.add(Text("${myData[i]}"));
    } 
  }


void updateUI()
{
setState((){});
 
}
  @override
  Widget build(BuildContext context) {
    return  Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.red,
        title: Text("Documents"),
        actions: <Widget>[
        ],
      ),
      body: Center(
        child: 
        Column(children: myListWidget.isEmpty?[Text("Waiting...")]:myListWidget),
      )
    );
  }
}
类PruebasVarias扩展StatefulWidget{
@凌驾
_PruebasVariasState createState()=>\u PruebasVariasState();
}
类_PruebasVariasState扩展状态{
列出myData=[];
列表myListWidget=[];
@凌驾
void initState(){
super.initState();
getallDocument().then(()=>updateUI()).catchError((错误)=>print(错误));
}
Future getallDocument()异步{
最终QuerySnapshot结果=等待Firestore.instance
.收集(“用户”)
.getDocuments();
最终列表文件OS=结果文件;
documentos.forEach((数据){
myData.add(data.documentID);
打印(myData);
});
对于(int i=0;i<(myData.length);i++){
添加(文本(“${myData[i]}”);
} 
}
void updateUI()
{
setState((){});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:Colors.red,
标题:文本(“文件”),
行动:[
],
),
正文:中(
儿童:
列(子项:myListWidget.isEmpty?[文本(“等待…”)]:myListWidget),
)
);
}
}

您可以在getallDocument方法的末尾使用FutureBuilder,也可以使用setState。您的答案对我也很有用,但平台不允许我标记两个正确答案。非常感谢你!