首页 > 解决方案 > 使用 Flutter & Firebase,如何检查用户之前是否登录过应用程序(电话号码认证)?

问题描述

我正在使用 Flutter 和来自Flutterfire的 firebase_auth 插件。这是我的应用程序中流程的样子:

  1. 初始化 Firebase。
  2. 我使用 StreamBuilder 来构建“登录页面”或“登录后的第一页”,具体取决于用户是否登录。以下是相关代码: 在此处输入图像描述

当没有用户登录时,snapshot.dataUser返回null,因此构建器构建“登陆页面”。3. 用户点击登录按钮,“登录页面”被推送到我们的“登录页面”之上。在这里,用户输入电话号码并点击“验证电话号码”按钮,触发以下代码:

try {
  await _auth.verifyPhoneNumber(
    phoneNumber: _phone,
    verificationCompleted: _verificationCompleted,
    verificationFailed: _verificationFailed,
    codeSent: _codeSent,
    codeAutoRetrievalTimeout: _codeAutoRetrievalTimeout,
    timeout: const Duration(seconds: 30),
  );
} catch (e) {
  print('Failed to verify phone number: $e');
}

Firebase 开始验证电话号码并通过 SMS 向电话发送 OTP。这会触发codeSent上述代码的 void 回调,从而导致 OTPTextField和“提交 OTP”按钮出现在页面上。3. 用户通过 SMS 输入 OTP 并点击“提交 OTP”按钮,触发以下代码:

PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.credential(
    verificationId: verificationId,
    smsCode: _otpController.text.trim(),
);
await signInWithPhoneAuthCredential(phoneAuthCredential);

Future<void> signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) async {
    UserCredential userCredential = await FirebaseAuth.instance.signInWithCredential(phoneAuthCredential);
    // Code to take in some user details
    // like address, topics to follow, etc.
    // These details need to be taken from
    // new users, because the "1st Page" depends
    // on them.
    return;
}

现在的问题是,每当方法signInWithCredential(phoneAuthCredential)完成执行时,firebase 都会让用户登录,并且此方法会通知其侦听器有关身份验证状态的更改,包括Stream<User> authStateChanges()我们在上面的步骤 2 中使用的更改。这会导致构建器从小部件树中提取登录页面(及其后代)并将其替换为“FirstPage”。因此,signInWithCredentials调用下面的所有内容都不会执行。我在 Firebase 控制台上观察到用户确实已登录。但我无法从新用户那里获取详细信息,这是注册后的第一件事。

我了解到该UserCredential userCredential对象有一个属性可以告诉我们用户是否新登录。它是使用以下代码获得的:

userCredential.additionalUserInfo.isNewUser

如果用户是新用户,则返回 true。但是我需要在方法signInWithCredentials通知其侦听器有关身份验证状态更改之前使用它。

我不可能每次登录时都提示同一个用户输入相同的详细信息。帮我解决这个问题。

标签: androidfirebaseflutterfirebase-authentication

解决方案


推荐阅读