Flutter 电子邮件启动器中的空值

Flutter 电子邮件启动器中的空值,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我从firestore读取数据,并将其用于电子邮件的url启动器。但是当提示打开电子邮件时,我得到的值为空。但它不会提示任何错误 将数据设置为var的代码已列出 var userName, userAdd, userAge, userResult, uniEmail; void emailDetail() async{ Widget build(BuildContext context) { return new StreamBuilder( stream:

我从firestore读取数据,并将其用于电子邮件的url启动器。但是当提示打开电子邮件时,我得到的值为空。但它不会提示任何错误

将数据设置为var的代码已列出

var userName, userAdd, userAge, userResult, uniEmail;

void emailDetail() async{
  Widget build(BuildContext context) {
      return new StreamBuilder(
          stream: UniQuery().getUserDetail(),
          builder: (BuildContext context, snapshot) {
            if (!snapshot.hasData)
              return new Text('Loading..... Please wait');

            var userDocument = snapshot.data;
             userName = userDocument['name'];
             userAge = userDocument['age'];
             userAdd = userDocument['address'];
             userResult= userDocument['result'];

             return new Text('Success read user data');
          }
      );
  }
}

void emailAddress() async{
  Widget build(BuildContext context) {
      return new StreamBuilder(
          stream: UniQuery().getUniBasedSelectedUni(),
          builder: (BuildContext context, snapshot) {
            if (!snapshot.hasData)
              return new Text('Loading..... Please wait');

            var userDocument = snapshot.data;
            uniEmail = userDocument['email'];

            return new Text('Success read university email');
          }
      );
  }
}

void sendEmail() async {
  emailDetail();
  emailAddress();
  var url = 'mailto:$uniEmail?subject= University Application'
      +'&body= Name: $userName \nAge: $userAge \nAddress: $userAdd'
      +'\nResult: $userResult';
  if (await canLaunch(url)) {
    await launch(url);
  }
  else {
    throw 'Could not launch $url';
  }
} 
用于从firestore获取用户详细信息和发件人电子邮件地址数据的代码

   Future<String> getCurrentUser() async{
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    final String uID = user.uid.toString();
    return uID;
  }

  setUserDetail() async{
    userID = await getCurrentUser();
  }

  getUserDetail(){
    setUserDetail();
    return dbReference.collection('User')
        .document(userID)
        .snapshots();
  }

  getUniBasedSelectedUni(){
    return dbReference.collection('University')
        .where('name', isEqualTo: selectedUni)
        .snapshots();
  }
Future getCurrentUser()异步{
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
最后一个字符串uID=user.uID.toString();
返回uID;
}
setUserDetail()异步{
userID=等待getCurrentUser();
}
getUserDetail(){
setUserDetail();
返回dbReference.collection('User')
.document(userID)
.快照();
}
getUniBasedSelectedUni(){
返回dbReference.collection('University')
.where('name',isEqualTo:selectedUni)
.快照();
}
我把它叫做sendEmail

bottomNavigationBar: BottomAppBar(
    color: Colors.blue,
    child: Row(
      mainAxisAlignment: MainAxisAlignment.spaceAround,
      children: <Widget>[

        IconButton(
          icon: Icon(Icons.home),
          onPressed:(){
            Navigator.push(context,MaterialPageRoute(builder: (context)
            => mainmenu()));
          },
        ),

        IconButton(
          icon: Icon(Icons.send),
          onPressed: (){
            sendEmail();
          }
        )
      ],
    ),
  ),
bottomNavigationBar:BottomAppBar(
颜色:颜色,蓝色,
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
图标按钮(
图标:图标(Icons.home),
已按下:(){
Navigator.push(上下文,MaterialPage路由(生成器:(上下文)
=>主菜单());
},
),
图标按钮(
图标:图标(Icons.send),
已按下:(){
sendmail();
}
)
],
),
),

您是否尝试等待:
等待setUserDetail()
?我没有,但我在其他方法上调用了该函数。。这很有效,你知道怎么解决吗?对不起,我不知道