如何通知FutureBuilder数据库已更新?

问题描述 投票:0回答:5

我有一个组配置文件页面,用户可以在其中更改组的描述。他点击描述,进入新屏幕并将其保存到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发生了变化,请重建;-)。

flutter flutter-layout
5个回答
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)


0
投票

为什么不使用Stream构建器而不是Future构建器?

StreamBuilder(stream: _future, ...)

为清晰起见,您可以将变量名称更改为_stream。


0
投票

我建议你不要在这种情况下使用未来的构建器,并在异步函数中使用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.
           });
      });
 }

-1
投票

这个怎么样?

@override
Widget build(BuildContext context) {
    if (_future == null) {
        // show loading indicator while waiting for data 
        return Center(child: CircularProgressIndicator());
    } else {
        return YourWidget();
    }
}

-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
    }
  },
);
© www.soinside.com 2019 - 2024. All rights reserved.