【问题标题】:Retrieving user email from Firebase in Flutter在 Flutter 中从 Firebase 检索用户电子邮件
【发布时间】: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() 来尝试显示已登录用户的电子邮件,但我一直显示“未来实例”。

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

谢谢。

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore firebase-authentication


    【解决方案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
    • 谢谢!我很感激。看来我必须对这些新更新进行应用范围内的更改。
    【解决方案3】:

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

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

    【讨论】:

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

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

    var currentUser = FirebaseAuth.instance.currentUser;
    
    
    Text('admin email: ${FirebaseAuth.instance.currentUser!.email}'),
    

    【讨论】:

      猜你喜欢
      • 2018-10-06
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多