使用 Flutter 和 Firebase,如何检查用户之前是否已登录应用(电话号码身份验证)?

时间:2021-07-06 20:30:56

标签: android firebase flutter firebase-authentication

我正在将 Flutter 与来自 Flutterfire 的 firebase_auth 插件一起使用。这是我的应用程序中的流程:

  1. 初始化 Firebase。
  2. 根据用户是否登录,我使用 StreamBuilder 构建“登陆页面”或“登录后的第一页”。这是相关的代码: enter image description here

当没有用户登录时,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 开始验证电话号码并通过短信向手机发送 OTP。这会触发上述代码中的 codeSent void 回调,从而导致 OTP TextField 和“提交 OTP”按钮出现在页面上。 3.用户通过短信输入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 都会让用户登录,并且此方法会通知其侦听器有关身份验证状态更改的信息,包括我们在上面第 2 步中使用的 Stream<User> authStateChanges() .这会导致构建器从小部件树中提取登录页面(及其后代)并将其替换为“FirstPage”。 因此,不会执行 signInWithCredentials 调用下面的所有内容。 我在 Firebase 控制台上观察到用户确实已登录。但我无法从新用户那里获取详细信息,这是注册后的第一件事。

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

userCredential.additionalUserInfo.isNewUser

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

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

0 个答案:

没有答案