使用FutureBuilder从Firestore获取Future <String>

时间:2020-05-12 09:34:55

标签: flutter dart future builder

这是我的代码,我想在其中显示一封Future电子邮件,但是我将从Firestore中获取它。但是,我不确定我将如何使用FutureBuilder检索我的值,我想将其用作一个字符串。

这是我获取电子邮件的方法:

Future<String> getEmail() async {
    String _email = (await FirebaseAuth.instance.currentUser()).email;
    DocumentSnapshot snapshot = await _firestore.collection('users')
      .document(_email)
      .collection('met_with')
      .document('email')
      .get();
    // print("data: ${snapshot.data}"); // might be useful to check
    return snapshot.data['email']; // or another key, depending on how it's saved
  }

这是我更新的代码:

      @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 3.0,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      child: ListTile(
        leading: CircleAvatar(
          backgroundImage: AssetImage(imagePath),
        ),
        trailing: Icon(Icons.more_horiz),
        title: Text(
          email,
          style: TextStyle(
            c  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 3.0,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      child: ListTile(
        leading: CircleAvatar(
          backgroundImage: AssetImage(imagePath),
        ),
        trailing: Icon(Icons.more_horiz),
        title: Text(
          email,
          style: TextStyle(
            color: Colors.deepPurple[700],
            fontWeight: FontWeight.bold,
          ),
        ),
        subtitle: Text(infection),
        onTap: () => showModalBottomSheet(
            context: context,
            builder: (builder) {

              return FutureBuilder(
                future: getEmail(),
                builder: (BuildContext context, snapshot) {
                if(snapshot.hasData){
                  if(snapshot.connectionState == ConnectionState.waiting){
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }else{
                    return Padding(padding: EdgeInsets.symmetric(vertical: 50.0, horizontal: 10.0),
                     child: Column(
                  children: <Widget>[
                    BottomSheetText(
                        question: 'Email', result:  snapshot.data['email']),
                    SizedBox(height: 5.0),
                    BottomSheetText(
                        question: 'Contact Time',result:"lol"),// getTimeStamp().toString()),
                    SizedBox(height: 5.0),
                    BottomSheetText(
                        question: 'Contact Location',
                        result: "help"),
                    SizedBox(height: 5.0),
                    BottomSheetText(question: 'Times Contacted', result: "lool",),
                  ],
                  ),


                     );
                  }
                }else{
                  return CircularProgressIndicator();}
                }








                     );




            }
        ),





                ),
              );



  }
}

这是我的Firebase数据库:

enter image description here

2 个答案:

答案 0 :(得分:0)

您需要使用FutureBuilder

           FutureBuilder(
                future: getEmail(),
                builder: (BuildContext context, snapshot) {
                if(snapshot.hasData){
                  if(snapshot.connectionState == ConnectionState.waiting){
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }else{
                   return Center( // here only return is missing
                      child: Text(snapshot.data['email'])
                    );
                  }
                }else if (snapshot.hasError){
                  Text('no data');
                }
                  return CircularProgressIndicator();
                },
              ),

这样,您可以在build方法内使用该方法的返回值。还将Future方法更改为以下内容:

Future<String> getEmail() async {
    String _email = (await FirebaseAuth.instance.currentUser()).email;
    return await _firestore.collection('users')
      .document(_email)
      .collection('met_with')
      .document('email')
      .get();
  }

答案 1 :(得分:0)

您的查询错误,请尝试以下一项。

Future<String> getEmail() async {
    String _email = (await FirebaseAuth.instance.currentUser()).email;
    var a = await Firestore.instance
            .collection("met_with")
            .where('email', isEqualTo:.  _email )
            .getDocuments();
     return a.documents[0]['email'];
}

要调用此方法,您需要futureBuilder。

FutureBuilder(
            future: getEmail(),
            builder: (BuildContext context, snapshot) {
            if(snapshot.hasData){
              if(snapshot.connectionState == ConnectionState.waiting){
                return Center(
                  child: CircularProgressIndicator(),
                );
              }else{
               return Center( // here only return is missing
                  child: Text(snapshot.data['email'])
                );
              }
            }else if (snapshot.hasError){
              return Text('no data');
            }
              return CircularProgressIndicator();
            },
          ),