我正在将 Flutter 与来自 Flutterfire 的 firebase_auth 插件一起使用。这是我的应用程序中的流程:
当没有用户登录时,snapshot.data
即 User
返回 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
通知其侦听器有关身份验证状态更改之前使用它。
我不可能在同一用户每次登录时都提示他/她输入相同的详细信息。 帮我解决这个问题。