【问题标题】:Null error when I want my firebase user id with currentUser()当我希望我的 firebase 用户 ID 与 currentUser() 时出现空错误
【发布时间】:2019-03-01 10:04:15
【问题描述】:

错误

NoSuchMethodError:在 null 上调用了方法“currentUser”。

接收者:空

尝试调用:currentUser()

我很想知道我需要在哪里使用此代码:

String _uid = '';
      void initState() {
        super.initState();
        auth.currentUser().then((userId) {
          setState(() {
            _uid = userId;
          });
        });
      }

此代码来自 home_page.dart(见下文)

我也尝试过使用:

widget.auth.current....

root_page

在文件的底部,我尝试了不同的方法。 而不是 HomePage 然后 _HomePageState(cmets out)

class RootPage extends StatefulWidget {

  RootPage({this.auth});
  final BaseAuth auth;

  @override
  State<StatefulWidget> createState() => new _RootPageState();

}

enum AuthStatus {
  notSignedIn,
  signedIn
}

class _RootPageState extends State<RootPage>{

  AuthStatus authStatus = AuthStatus.notSignedIn;

  @override
  void initState() {
    super.initState();
    widget.auth.currentUser().then((userId) {
      setState(() {
        authStatus = userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
      });
    });
  }

  void _signedIn(){
    setState(() {
      authStatus = AuthStatus.signedIn;
    });
  }

  void _signedOut() {
    setState(() {
      authStatus = AuthStatus.notSignedIn;
    });
  }

  @override
  Widget build(BuildContext context) {
    switch(authStatus) {
      case AuthStatus.notSignedIn:
        return new LoginPage(
          auth: widget.auth,
          onSignedIn: _signedIn,
        );
      case AuthStatus.signedIn:
        /*
        return new HomePageState(
          auth: widget.auth,
          onSignedOut: _signedOut,
        );
        */
        return new HomePage(
          auth: widget.auth,
          onSignedOut: _signedOut,
        );
    }
  }
}

auth.dart

这是我用来从 auth 获取当前用户的类。

abstract class BaseAuth{
  Future<String> signInWithEmailAndPassword(String email, String password);
  Future<String> createUserWithEmailAndPassword(String email, String password);
  Future<String> currentUser();
  Future<void> signOut();
}

class Auth implements BaseAuth{

  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Future<String> signInWithEmailAndPassword(String email, String password) async {
    FirebaseUser user = await _firebaseAuth.signInWithEmailAndPassword(email: email, password: password);
    return user.uid;
  }

  Future<String> createUserWithEmailAndPassword(String email, String password) async {
    FirebaseUser user = await _firebaseAuth.createUserWithEmailAndPassword(email: email, password: password);
    return user.uid;
  }

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

  Future<void> signOut() async {
    return _firebaseAuth.signOut();
  }

}

home_page.dart

我在这个文件中尝试了不同的东西,但得到了不同的错误。

class HomePage extends StatefulWidget {

  HomePage({this.auth, this.onSignedOut});

  final BaseAuth auth;
  final VoidCallback onSignedOut;

  void _signOut() async {
    try {
      await auth.signOut();
      onSignedOut();
    } catch (e) {
      print(e);
    }
  }
  @override
  State<StatefulWidget> createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
/*
  _HomePageState({this.auth, this.onSignedOut});
  final BaseAuth auth;
  final VoidCallback onSignedOut;
  */
  //final BaseAuth auth;

  String _uid = '';

  @override
  void initState() {
    super.initState();
    auth.currentUser().then((userId) {
      setState(() {
        _uid = userId;
      });
    });
  }

【问题讨论】:

    标签: firebase firebase-authentication flutter


    【解决方案1】:

    _auth.currentUser() 不返回用户 ID it returns a FirebaseUser object

    改成这样:

    auth.currentUser().then((user) {
      if (user == null || user.isAnonymous) {
        // what will you do?
        return;
      }
      setState(() {
        _uid = user.uid;
      });
    });
    

    不过,我建议monitor the onAuthStateChanged stream instead。这样,当用户登录或注销时,您会立即收到通知。

    检查this article,它涵盖了它的深度。

    【讨论】:

      【解决方案2】:

      你可以这样使用。

      someMethod() async {
         FirebaseUser user = await FirebaseAuth.instance.currentUser();
         print(user.uid);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2015-02-15
        • 2017-11-11
        • 2020-09-03
        • 1970-01-01
        • 2019-04-10
        相关资源
        最近更新 更多