'Future <dynamic>类型不是'String'类型的子类型

时间:2020-05-12 08:40:22

标签: string flutter dart future subtype

所以我正在尝试从Firestore文档中检索数据,这是一封电子邮件 我不明白从Firestore检索数据时如何将数据另存为字符串。 帮助。

获取错误:在结果上,类型'Future不是类型'String'的子类型:getEmail() ps:即时通讯新手 我的代码:

getEmail() async{
  String _email = (await FirebaseAuth.instance.currentUser()).email;
  return _firestore.collection('users').document(_email).collection('met_with').document('email').get();
}

...

children: <Widget>[
  BottomSheetText(question: 'Email', result:getEmail()),
  SizedBox(height: 5.0),
....

1 个答案:

答案 0 :(得分:0)

..document('email)'.get()实际上将返回Future<DocumentSnapshot>。因此,getEmail()不会返回String

您需要从DocumentSnapshot中获取数据:

Future<String> getEmail() async {
  String _email = (await FirebaseAuth.instance.currentUser()).email;
  DocumentSnapshot snapshot = await _firestore.collection('users')
    .document(_email)
    .collection('met_with')
    .document('email')
    .get();
  // print("data: ${snapshot.data}"); // might be useful to check
  return snapshot.data['email']; // or another key, depending on how it's saved
}

有关更多信息,请查看API reference

中的文档

现在,除此之外,getEmail()是一个异步函数。从窗口小部件树中调用它可能不是您要处理的方式。 您需要等待getEmail()的结果,然后才能在用户界面中使用它。 FutureBuilder可能会帮助:

children: <Widget>[
  FutureBuilder<String>(
    future: getEmail(),
    builder: (context, snapshot) {
      if(!snapshot.hasData) {
        return CircularProgressIndicator(); // or null, or any other widget
      }
      return BottomSheetText(question: 'Email', result: snapshot.data);
    },
  ),
  SizedBox(height: 5.0),
  ... //other
],