我有一个组配置文件页面,用户可以在其中更改组的描述。他点击描述,进入新屏幕并将其保存到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
在main构建方法中,并且像这样得到“已经加载”的未来:
FutureBuilder(future: _future, ...)
现在我想告诉他:_future发生了变化,请重建;-)。
好的,我像这样管理它(它只带了几行代码)。保持代码不变,并从导航器获得真正的回调,以便知道第二页上有更改:
// 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)
。
为什么不使用Stream构建器而不是Future构建器?
StreamBuilder(stream: _future, ...)
为清晰起见,您可以将变量名称更改为_stream。
我建议你不要在这种情况下使用未来的构建器,并在异步函数中使用future.then(),并在不使用将来的构建器的情况下更新构建之后。
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.
});
});
}
这个怎么样?
@override
Widget build(BuildContext context) {
if (_future == null) {
// show loading indicator while waiting for data
return Center(child: CircularProgressIndicator());
} else {
return YourWidget();
}
}
您不需要设置任何状态。您只需要在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
}
},
);