在 Flutter 中从 Firebase 检索用户电子邮件

Posted

技术标签:

【中文标题】在 Flutter 中从 Firebase 检索用户电子邮件【英文标题】:Retrieving user email from Firebase in Flutter 【发布时间】:2020-12-11 00:04:15 【问题描述】:

在我处理登录、登录、注销身份验证的 AuthProvider 类中,我创建了 2 个返回未来字符串的函数,如下所示

  Future<String> currentUser() async 
    FirebaseUser user = await _auth.currentUser();
    return user.uid;
  


  Future<String> getCurrentUserEmail() async 
    FirebaseUser user = await _auth.currentUser();
    final String email = user.email.toString();
  //  print(email);
    return email;
  

在我的菜单屏幕中,我想在文本字段中显示我当前登录的用户电子邮件,我将其称为如下。

    UserAccountsDrawerHeader(
      accountName: Text('Brad Pitt'),
      accountEmail: Text(
          '$AuthProvider.of(context).auth.getCurrentUserEmail()'),

我曾尝试同时使用 currenUser() 和 getCurrentUserEmail() 来尝试显示已登录用户的电子邮件,但我一直显示“未来实例”。

我在这里忽略了什么?我已经尝试了所有我能想到的方法。

谢谢。

【问题讨论】:

【参考方案1】:

由于您的getCurrentUserEmail 返回一个Future,您需要use a FutureBuilder 才能在您的构建方法中使用它。

accountEmail: FutureBuilder<String>(
  future: AuthProvider.of(context).auth.getCurrentUserEmail(),
  builder: (BuildContext context, AsyncSnapshot<String> snapshot) 
    if (snapshot.hasData) 
      return Text(snapshot.data)
    
    else 
      return Text("Loading user data...")
    

  
)

【讨论】:

这也不能解决我的问题。我得到了红色和黄色的涂鸦线。错误消息显示:A build function returned Bull.The 有问题的小部件是:FutureBuilder 构建函数绝不能返回 null。要返回导致建筑小部件填满可用空间的空白空间,请返回“Container()”。要返回占用尽可能少空间的空白空间,请返回“Container(width: 0.0, height: 0.0)”。 啊,这可能是由于缺少退货声明,所以我更新了我的答案以添加这些。我还添加了指向有关FutureBuilder 的文档的链接。我强烈建议您了解这一点(它是什么、为什么需要它、它是如何工作的),这样您就可以自己解决后续问题。【参考方案2】:

最好升级到firebase_auth:0.18.0,升级后可以同步得到currentUser

dependencies:
  flutter:
    sdk: flutter
  firebase_core : ^0.5.0
  firebase_auth : ^0.18.0

初始化 Firebase:

void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());

然后在UsersAccountDrawerHeader:

   UserAccountsDrawerHeader(
      accountName: Text('Brad Pitt'),
      accountEmail: Text('$auth.instance.currentUser.email'),

同时检查:

Undefined class 'FirebaseUser'

No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() in Flutter and Firebase

【讨论】:

谢谢。当前的依赖版本是 firebase_core: ^0.4.5 firebase_auth: ^0.16.1 cloud_firestore: ^0.13.7 根据您的建议,哪个版本的 Cloud Firestore 可以与上述 firebase_auth 和 firebase_core 更新兼容? 0.14.0 和核心 0.5.0 如答案,auth 0.18.0 检查***.com/questions/63473865/… 谢谢!我很感激。看来我必须对这些新更新进行应用范围内的更改。【参考方案3】:

你需要在函数前面加上~await~,因为它是一个返回~Future~的函数

await AuthProvider.of(context).auth.getCurrentUserEmail()

【讨论】:

我不能在我的构建方法中调用它。它会抛出一个错误并迫使我将我的默认构建函数声明为 Future 并向其添加异步。【参考方案4】:

检索用户电子邮件,支持空值安全。

var currentUser = FirebaseAuth.instance.currentUser;


Text('admin email: $FirebaseAuth.instance.currentUser!.email'),

【讨论】:

以上是关于在 Flutter 中从 Firebase 检索用户电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase获取数据

在 Flutter 中从 Firebase 实时数据库读取和存储数据

Flutter Firebase异步查询未在流函数中检索数据

在 Flutter 中从 Firebase 读取数组 [重复]

如何在flutter中从firebase数据填充listview

如何在 Flutter 中从 firebase 存储读取和写入文本文件?