我使用以下功能从Firestore获取userData:
Future<String>getRegisterUserData({String userID}) async {
Firestore.instance.collection("Users").document(userID).get().then(
(datasnapshot) {
if (datasnapshot.exists) {
return datasnapshot.data['Email'];
} else {
return "Loading...";
}
},
);
}
我在UserProfilePage上执行此功能,如下所示:
_email = widget.firestore.getRegisterUserData(widget.userID).toString();
但是我总是得到打印声明:'Future'的实例,而不是保存的电子邮件地址...
我也尝试这样做:
Future<String> getRegisterUserData({String userID}) async {
String email;
Firestore.instance.collection("Users").document(userID).get().then(
(datasnapshot) {
if (datasnapshot.exists) {
email = datasnapshot.data['Email'];
} else {
email = "Loading...";
}
},
);
return email;
}
打印语句始终相同...
那我的错误在哪里?我想在UserProfilePage上的变量中显示“电子邮件”的值,还是我的Firestore函数不正确?
谢谢您的帮助
答案 0 :(得分:0)
已更新
根据您的信息,您需要FutureBuilder
才能等待响应来构建窗口小部件:
return FutureBuilder(
future: getRegisterUserData(userID: "1234"),
builder: (context, asyncsnapshot){
return asyncsnapshot.hasData && asyncsnapshot.data != null ? TextFormField(
initialValue: asyncsnapshot.data,
) : CircularProgressIndicator();
}
);
答案 1 :(得分:0)
添加await
关键字。但是在另一个地方。
tempEmail = await widget.firestore.getRegisterUserData(widget.userID);
setState(() {
_email = tempEmail;
});
// we don't need toString as getRegisterUserData itself is returning Future<String>
注意:使用等待:当我们使用await
时,包含它的方法/函数的签名中应该带有async
。
或者您可以使用then
块
widget.firestore.getRegisterUserData(widget.userID).then((email) {
setState(() {
_email = email;
});
});
说明:widget.firestore.getRegisterUserData(widget.userID)
的类型为Future<String>
。这就是为什么将其打印为“未来”实例的原因。我们必须通过await
或then
块将Future转换为String
使用共享首选项:
Future<String> getEmail() async {
final prefs = await SharedPreferences.getInstance();
String email = prefs.getString('email');
if (email != null) {
return email;
} else {
email = await widget.firestore.getRegisterUserData(widget.userID);
prefs.setString('email', email); //update shared preferences
return email;
}
}
// usage (may be in initState)
widget.getEmail().then((email) {
setState(() {
_email = email;
})
})