Dart Flatter和Firebase:如何从函数接收数据?
我使用以下函数从Firestore获取用户数据:Dart Flatter和Firebase:如何从函数接收数据?,dart,google-cloud-firestore,flutter,Dart,Google Cloud Firestore,Flutter,我使用以下函数从Firestore获取用户数据: Future<String>getRegisterUserData({String userID}) async { Firestore.instance.collection("Users").document(userID).get().then( (datasnapshot) { if (datasnapshot.exists) { return datasnapshot.data['Email'];
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...";
}
},
);
}
但我总是得到打印声明:“未来”的实例,而不是保存的电子邮件地址
我也尝试这样做:
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;
}
Future getRegisterUserData({String userID})异步{
字符串电子邮件;
Firestore.instance.collection(“Users”).document(userID.get()。然后(
(快照){
if(datasnapshot.exists){
email=datasnapshot.data['email'];
}否则{
电子邮件=“正在加载…”;
}
},
);
回复邮件;
}
打印语句总是相同的
那么我的错误在哪里呢?我想在UserProfile页面的变量中显示“Email”的值,还是我的firestore函数不正确
感谢您的帮助更新 根据您的信息,您需要一个
FutureBuilder
,以便等待响应来构建您的小部件:
return FutureBuilder(
future: getRegisterUserData(userID: "1234"),
builder: (context, asyncsnapshot){
return asyncsnapshot.hasData && asyncsnapshot.data != null ? TextFormField(
initialValue: asyncsnapshot.data,
) : CircularProgressIndicator();
}
);
添加
wait
关键字。但是在另一个地方
tempEmail = await widget.firestore.getRegisterUserData(widget.userID);
setState(() {
_email = tempEmail;
});
// we don't need toString as getRegisterUserData itself is returning Future<String>
说明:widget.firestore.getRegisterUserData(widget.userID)
属于未来类型
。这就是为什么它被打印为“未来”的实例。我们必须通过wait
或then
块将未来转换为字符串
widget.firestore.getRegisterUserData(widget.userID).then((email) {
setState(() {
_email = email;
});
});
使用SharedReferences:
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;
})
})
Future getEmail()异步{
final prefs=wait SharedPreferences.getInstance();
String email=prefs.getString('email');
如果(电子邮件!=null){
回复邮件;
}否则{
email=wait widget.firestore.getRegisterUserData(widget.userID);
prefs.setString('email',email);//更新共享首选项
回复邮件;
}
}
//用法(可能处于初始状态)
widget.getEmail()。然后((电子邮件){
设置状态(){
_电子邮件=电子邮件;
})
})
我添加了wait关键字,但问题仍然存在。。。我还能做些什么来解决这个问题?你确定你的收集和数据存在吗?您能否只返回一个测试字符串以确保是的,请如下所示:当添加catchError方法时,我没有从firestore获得任何错误…您是否可以打印一些内容:if(datasnapshot.exists){在那之后?是的,这是有效的…但在我的应用程序中,我总是看到字符串:“Future”的实例这意味着什么?这不起作用。电子邮件地址不会在TextFormField中显示为initialValue。initialValue现在不会显示…我们必须使用setState((){})
获取数据后重新呈现。相应地更新答案。感谢您的回答…我有最后一个问题:在每次重新启动应用程序或重新呈现页面时,如何保存电子邮件地址而不从Firestore查询它?我可以使用initState方法执行此操作吗?它如何与YouTube等应用程序一起工作?应用程序必须还可以临时缓存数据。您可以使用共享\u首选项
,它最适合快速存储/获取小数据。请参阅…如果我的上述答案有用,您可以向上投票/接受吗?
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;
})
})