Flutter和Firebase:如何从功能接收数据?

时间:2018-08-10 14:01:01

标签: dart google-cloud-firestore flutter

我使用以下功能从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函数不正确?

谢谢您的帮助

2 个答案:

答案 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>。这就是为什么将其打印为“未来”实例的原因。我们必须通过awaitthen块将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;
   })
 })