【问题标题】:Firebase Authentication in Flutter Check if user is a new userFlutter中的Firebase身份验证检查用户是否是新用户
【发布时间】:2021-12-26 01:55:30
【问题描述】:

我已经实现了以下登录方法,我正在尝试使用isNewUser函数来推送一个新屏幕:

Future<void> googleLogin() async {
    try {
      final googleUser = await GoogleSignIn().signIn();

      if (googleUser == null) return;

      final googleAuth = await googleUser.authentication;
      final authCredential = GoogleAuthProvider.credential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );
      UserCredential userCredential =
          await FirebaseAuth.instance.signInWithCredential(authCredential);
      if (userCredential.additionalUserInfo!.isNewUser) {
       return const SignUpNewUser();
      }
    } on FirebaseAuthException catch (e) {
      AlertDialog(
        title: const Text("Error"),
        content: Text('Failed to sign in with Google: ${e.message}'),
      );
    }
  }

我收到以下错误:

A value of type 'SignUpNewUser' can't be returned from the method 'googleLogin' because it has a return type of 'Future<void>'.

我很确定我将它放置在正确的位置以实现该功能,但我不知道如何在未来实现它。

【问题讨论】:

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


【解决方案1】:

您可以直接返回一个小部件,但这没有意义,因此您需要使用Navigator 才能推送到新屏幕。

  1. 在方法googleLogin()中添加context作为参数

  2. 使用这个Navigator.push(context,MaterialPageRoute(builder: (context) =&gt;your_new_screen()),); 在条件userCredential.additionalUserInfo!.isNewUser

    在上面将your_new_screen() 替换为您之前返回的小部件,即。 SignUpNewUser()

【讨论】:

  • 您的解决方案在按下登录按钮时抛出错误The following NoSuchMethodError was thrown while handling a gesture: Closure call with mismatched arguments: function 'AuthService.googleLogin' Receiver: Closure: (dynamic) =&gt; Future&lt;void&gt; from Function 'googleLogin':. Tried calling: AuthService.googleLogin() Found: AuthService.googleLogin(dynamic) =&gt; Future&lt;void&gt;
【解决方案2】:

问题出在返回类型上,需要将类型从 void 改为 dynamic。

Future<dynamic> googleLogin() async {...}

【讨论】:

  • 这会清除错误但不会推送到新屏幕。是否需要更改返回函数?
  • 你在哪里调用这个函数?您需要上下文才能使用 Navigator.push( context, MaterialPageRoute(builder: (context) => SignUpNewUser()), );
  • 我已经尝试过了,但是 Conext 抛出了与构建上下文相关的错误。 The argument type 'Context' can't be assigned to the parameter type 'BuildContext'.
  • 在调用navigator.push的时候可以放代码好吗?
  • UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(authCredential); if (userCredential.additionalUserInfo!.isNewUser) { return Navigator.push( context, MaterialPageRoute(builder: (context) =&gt; SignUpNewUser()), ); }
猜你喜欢
  • 2019-01-20
  • 2019-12-29
  • 2017-05-15
  • 2019-08-02
  • 1970-01-01
  • 2023-03-04
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多