如何在扑扑的firebase中解决此NoSuchMethodError

时间:2018-08-21 15:08:20

标签: firebase flutter

我有此代码,该代码应返回userId。问题是,由于用户已注销,它返回null。

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

即使在将catch包缠起来之后,这仍然会引发错误。错误冻结了我的应用 错误:

Exception has occurred.
NoSuchMethodError: The getter 'uid' was called on null.
Receiver: null
Tried calling: uid

尝试调用的方法是

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

3 个答案:

答案 0 :(得分:3)

尝试一下:

     widget.auth.currentUser().then((userId) {
        setState(() {
         authStatus = userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
        });
      }).catchError((onError){
        authStatus = AuthStatus.notSignedIn;
      });

更新 如果firebaseAuth返回null,则不能使用用户的uid属性,因为它为null。

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

答案 1 :(得分:2)

好像您在看Andrea Bizzotto的登录播放列表,对吗?

我也通过了它。我设法解决错误的方法是更改​​auth.currentUser()声明的位置。您可能已经在Auth auth内创建了StatelessWidget

尝试将Auth的实例从StatelessWidget移到State,正好在void initState()之前。

并替换您的代码,以便您可以从Auth访问State。像这样:

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    try {
      auth.currentUser().then((userId) { //I've removed the 'widget.'
        setState(() {
          authStatus =
              userId == null ? AuthStatus.notSignedIn : AuthStatus.signedIn;
        });
      });
    } catch (e) {}
  }

完成此操作后,您的代码不应再抛出此错误。

答案 2 :(得分:0)

FirebaseUser _user;

  @override
  void initState() {
    super.initState();
    _checkUser();
  }

  @override
  Widget build(BuildContext context) {
    if (_user == null) {
      return AuthStatus.notSignedIn;
    } else {
      return AuthStatus.signedIn;
    }
  }

  Future<void> _checkUser() async {
    _user = await FirebaseAuth.instance.currentUser();
    setState(() {});
  }