【问题标题】:Flutter access firebase user email from different classFlutter 访问不同类别的 Firebase 用户电子邮件
【发布时间】:2020-11-09 00:19:51
【问题描述】:

我在这个问题上被困了好几个小时。

当 getCurrentUser 函数在同一个类 (SlateScreen) 中定义和调用时,我访问 final currentUser = loggedInUser.email; 没有问题。

我的 SlateScreen 类和 MessageStream 类都在同一个 .dart 文件中。所以这在这里有效:

final firestore = Firestore.instance;

/// loggedInUser variable for fetching the user email later
FirebaseUser loggedInUser;

DatabaseMethods databaseMethods = DatabaseMethods();

class TheSlateScreen extends StatefulWidget {
  static String id = 'theslate_screen';
  @override
  _TheSlateScreenState createState() => _TheSlateScreenState();
}

class _TheSlateScreenState extends State<TheSlateScreen> {

final _auth = FirebaseAuth.instance;
    
// call getCurrentUser in initState    
@override
  void initState() {
    super.initState();
    getCurrenUser();       
  }

getCurrentUser() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedInUser = user;
        print(loggedInUser);
      }
    } catch (e) {
      print(e);
    }
  }

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

// fetch the email from my getCurrentUser function
final currentUser = loggedInUser.email;

但是如果我在 DatabaseMethods 类中定义我的 getCurrentUser() 函数,然后在 SlateScreen 类中调用它,则会收到“getter email was called on null”错误

 @override
  void initState() {
    super.initState();
    databaseMethods.getCurrentUser(_auth);
  }

我的 DatabaseMethods 类:

class DatabaseMethods {    
  FirebaseUser loggedInUser;
  getCurrentUser(FirebaseAuth _auth) async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedInUser = user;
      }
    } catch (e) {
      print(e);          
    }
  }

我尝试了各种调整,但没有成功...

更新/解决方案:

感谢提供的答案,我找到了一种方法:

在我的 DatabaseMethods 类中,我只返回用户:

Class DatabaseMethods {
  getCurrentUser(FirebaseAuth _auth) async {
    try {
      final user = await _auth.currentUser();

      if (user != null) {
        return user;
      }
    } catch (e) {
      print(e);
    }
  }
}

在 SlateScreen 类中,我使用了一个可以在 initState() 中调用的辅助函数:

@override
  void initState() {
    super.initState();
    logInUser(_auth);
  }

  logInUser(_auth) async {
    loggedInUser = await DatabaseMethods().getCurrentUser(_auth);
  }

【问题讨论】:

  • MessagesStream 是如何使用的?
  • 感谢您的回答。我在问题中更新了我的解决方案。又为我节省了几个小时的反复试验。
  • 为什么FirebaseAuth.instance.getUser() 不可行?

标签: firebase flutter firebase-authentication


【解决方案1】:

您需要初始化loggedInUser,只需执行以下操作:

loggedInUser = await FirebaseAuth.instance.currentUser();
final currentUser = loggedInUser.email;

【讨论】:

    【解决方案2】:

    在这个sn-p中:

    // fetch the email from my getCurrentUser function
    final currentUser = loggedInUser.email;
    

    loggedInUser 变量仅在 getCurrentUser 方法完成后设置。因此,您不能只在代码中的任何位置执行 loggedInUser.email,而只能在确保 getCurrentUser 已完成之后才能执行此操作。

    所以这可以正常工作:

    await databaseMethods.getCurrentUser(_auth);
    final currentUser = loggedInUser.email;
    

    鉴于您分享的内容,它可能可以在您的 initState 中添加 await

    @override
    void initState() {
      super.initState();
      await databaseMethods.getCurrentUser(_auth);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2020-10-08
      • 2020-12-11
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2019-02-07
      相关资源
      最近更新 更多