我有一个网上论坛资料页面,用户可以在其中更改网上论坛的说明。他单击描述,进入新屏幕,然后将其保存到Firestore。然后,他通过Navigator.pop(context)
返回到群组个人资料页面,该页面通过FutureBuilder
列出了所有元素。
首先,我在主要的构建方法(直接在将来的构建器“ future:request”中)中有针对我的FutureBuilder
的数据库请求,但该命令是有效的,但我知道这是错误的。但是现在我必须等待重建才能看到更改。如何告诉FutureBuilder
有数据更新?
我正在组配置文件页面中按以下方式加载Firestore数据:
Future<DocumentSnapshot> _future;
@override
void initState() {
super.initState();
_getFiretoreData();
}
Future<void> _getFiretoreData() async{
setState(() {
this._future = Firestore.instance
.collection('users')
.document(globals.userId.toString())
.get();});
}
FutureBuilder
位于主要的build方法内部,并获得“已加载”的未来,例如:
FutureBuilder(future: _future, ...)
现在,我想告诉他:_future发生了更改,请重建;-)。
答案 0 :(得分:2)
好,我是这样管理的(只花了几行代码)。保持代码不变,并从导航器获取真实的回调,以了解第二页上有更改:
// check if second page callback is true
bool _changed = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
ProfileUpdate(userId: globals.userId.toString())),
);
// if it's true, reload future data
_changed ? _getFiretoreData() : Container();
在第二页上,给保存按钮一个Navigator.pop(context, true)
。
答案 1 :(得分:0)
为什么不使用Stream构建器而不是Future构建器?
StreamBuilder(stream: _future, ...)
为清楚起见,您可以将变量名称更改为_stream。
答案 2 :(得分:0)
我建议您在这种情况下不要使用future生成器,而应在异步函数中使用future.then(),并且在获取数据后不使用future生成器来更新生成。.
Future getData() async {
//here you can call the function and handle the output(return value) as result
getFiretoreData().then((result) {
// print(result);
setState(() {
//handle your result here.
//update build here.
});
});
}
答案 3 :(得分:-1)
怎么样?
@override
Widget build(BuildContext context) {
if (_future == null) {
// show loading indicator while waiting for data
return Center(child: CircularProgressIndicator());
} else {
return YourWidget();
}
}
答案 4 :(得分:-1)
您不需要设置任何状态。您只需要在GetFirestoreData方法中返回用户集合即可。
Future<TypeYouReturning> _getFirestoreData() async{
return Firestore.instance
.collection('users')
.document(globals.userId.toString())
.get();
}
在您的FutureBuilder小部件内,您可以进行Theo建议的设置,我会做类似的事情
return FutureBuilder(
future: _getFirestoreData(),
builder: (context, AsyncSnapshot<TypeYouReturning> snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
} else {
if (snapshot.data.length == 0)
return Text("No available data just yet");
return Container();//This should be the desire widget you want the user to see
}
},
);