android - 使用 Flutter & Firebase,如何检查用户之前是否登录过应用程序(电话号码认证)?
问题描述
我正在使用 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 开始验证电话号码并通过 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
通知其侦听器有关身份验证状态更改之前使用它。
我不可能每次登录时都提示同一个用户输入相同的详细信息。帮我解决这个问题。
解决方案
推荐阅读
- flutter - 更新flutter到1.22.0-12.0.pre后报错包:flutter/src/widgets/scroll_position.dart': _pendingDimensions': is not true
- arrays - EXCEL VBA:我的宏正在创建一个 3D 维度数组
- javascript - 如何检测何时显示数字键盘(在移动设备上)?
- java - 在打开背景后,Android 应用程序不会从 mainactivity 重新启动
- excel - 从工作表中读取数据
- python - 发生异常时如何要求用户输入?
- python - 在同一项目中列出来自 Cloud Function 的 GCS 存储桶 blob
- typescript - JSDoc:@callback 和 @property?
- python - 检查列表中的任何项目是否在 Python 中的另一个列表中的最优雅的方法是什么?
- flutter - Flutter 可重用方法/小部件