在使用谷歌登录进行身份验证之前检查用户是否登录 - flutter

时间:2021-01-02 19:27:59

标签: firebase flutter authentication dart google-signin

在我的 flutter 应用程序中,我试图在 Firebase 中对用户进行身份验证之前检查用户是否已登录,因此如果他不是,则不要进行身份验证

 Future<String> loginUserWithGoogle() async {
    String returnValue = "error";
    GoogleSignIn _googleSignIn = GoogleSignIn(
      scopes: [
        'email',
        'https://www.googleapis.com/auth/contacts.readonly',
      ],
    );
    UserData _user = UserData();
    try {
      GoogleSignInAccount _googleUser = await _googleSignIn.signIn();
      GoogleSignInAuthentication _googleAuth = await _googleUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.credential(idToken: _googleAuth.idToken, accessToken: _googleAuth.accessToken);
      UserCredential _authResult = await _auth.signInWithCredential(credential);
      if (_authResult.additionalUserInfo.isNewUser) {
        String userGoogleName = _authResult.user.displayName;
        List userSplitName = userGoogleName.split(" ");
        String userGoogleFirstName = userSplitName.first;
        String userGoogleLastName = userSplitName.last;

        SharedPreferences prefs = await SharedPreferences.getInstance();
        await prefs.setString('googleUid', _authResult.user.uid);
        await prefs.setString('googleEmail', _authResult.user.email);
        await prefs.setString('googleFirstName', userGoogleFirstName);
        await prefs.setString('googleLastName', userGoogleLastName);
        await prefs.setString('googleUserType', "user");

        returnValue = "new";
      } else {
        _currentUser = await RealDatabase().getUserData(_authResult.user.uid);
        if (_currentUser != null) {
          returnValue = "success";
        }
      }
    } on PlatformException catch (e) {
      returnValue = e.message;
    } catch (e) {
      print(e);
    }
    return returnValue;
  }
}

这里我要检查的是,如果是新用户,则将他的谷歌数据保存在 sharedpreference 中,然后将他带到另一个页面,在那里他可以完成其他一些注册,然后登录。但是这段代码的作用是如果是新用户,它将进行身份验证,将信息保存在 sharedpeference 中,然后将他带到该页面,如果该用户决定返回上一页(因为我使用 Navigator.push(context))并仍然单击谷歌再次登录按钮,然后它会将他带到主屏幕,而无需他完成我希望他做的其他注册,因为它已经首先对他进行了身份验证。那么,有没有一种方法可以在不首先对用户进行身份验证的情况下做到这一点。

1 个答案:

答案 0 :(得分:0)

你可以这样检查;(我从我的代码中复制)

  Userrs _takeAnParamaterFromUser(User user) {
    return user != null ? Userrs(uid: user.uid) : null;
  }

  
  get userCheck {
    return _auth
        .authStateChanges()
        .map(_takeAnParamaterFromUser);
  }

if(usercheck == null) {
  return Authenticate();
}else {
  return Home();
}

这是重点; authStateChanges()