Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart Flatter和Firebase:如何从函数接收数据?_Dart_Google Cloud Firestore_Flutter - Fatal编程技术网

Dart Flatter和Firebase:如何从函数接收数据?

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'];

我使用以下函数从Firestore获取用户数据:

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;
   })
 })