Firebase 颤振当我从未来函数收到值时,我的UI不会更新
我的问题是,当我从Firestore接收信息时,我会在控制台中看到它打印出来,但我的UI不会更新。但直到我按下再次显示屏幕的图标。底部导航栏中包含我的小部件列表的屏幕 我希望代码中出现的情况是,当我选择底部导航栏中包含屏幕的选项卡时,小部件列表将显示DocumentID的名称。那么,目前我必须再次选择选项卡,以便它们出现 我附上我的密码Firebase 颤振当我从未来函数收到值时,我的UI不会更新,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我的问题是,当我从Firestore接收信息时,我会在控制台中看到它打印出来,但我的UI不会更新。但直到我按下再次显示屏幕的图标。底部导航栏中包含我的小部件列表的屏幕 我希望代码中出现的情况是,当我选择底部导航栏中包含屏幕的选项卡时,小部件列表将显示DocumentID的名称。那么,目前我必须再次选择选项卡,以便它们出现 我附上我的密码 class PruebasVarias extends StatefulWidget { @override _PruebasVariasState c
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。您的答案对我也很有用,但平台不允许我标记两个正确答案。非常感谢你!