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

时间:2019-03-28 21:14:30

标签: flutter flutter-layout

我有一个网上论坛资料页面,用户可以在其中更改网上论坛的说明。他单击描述,进入新屏幕,然后将其保存到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发生了更改,请重建;-)。

5 个答案:

答案 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
    }
  },
);