如何在视图模型中实现 Firebase 电话身份验证?
Posted
技术标签:
【中文标题】如何在视图模型中实现 Firebase 电话身份验证?【英文标题】:How can firebase phone auth be implemented in view model? 【发布时间】:2021-04-10 04:42:00 【问题描述】:我正在尝试使用 Kotlin 在视图模型中添加 Firebase 电话身份验证代码。问题是PhoneAuthProvider
需要一个活动。有谁知道如何在不需要活动的情况下在视图模型中实现此代码?
谢谢!
val mCallbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks ...
val options = PhoneAuthOptions.newBuilder(auth).apply
setPhoneNumber(phoneNumber)
setTimeout(120L, TimeUnit.SECONDS)
setActivity(this) <-------------------------- // Activity (for callback binding)
setCallbacks(mCallbacks)
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
【问题讨论】:
【参考方案1】:结果证明这是对 API 20 (check out this issue on Github) 的有意更改,尽管它违反了 MVVM 架构。需要活动的原因是该方法回退到 reCAPTCHA。实现它的正确方法是“尚未确定”。
【讨论】:
你最终选择了两个“邪恶”中的哪一个,视图模型中的活动实例或直接在片段/活动中做所有事情? 不能再同意了,他们都是邪恶的。但是不,永远不要在视图模型中使用活动实例。可惜还没修好。【参考方案2】:我的方法是在 viewModel 中包含所有内容,包括回调。然后我在 viewModel 中调用一个函数并传入一个活动参数。见下文:
fun verifyPhoneNumber(phoneNumber: String, activity: Activity)
_validFullPhoneNumber.value = phoneNumber
val options = PhoneAuthOptions.newBuilder(mAuth)
.setPhoneNumber(phoneNumber) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(activity)
.setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
在 UI 控制器中,我称之为片段:
viewModel.verifyPhoneNumber(validatedPhoneNumber, requireActivity())
与重新发送按钮功能相同。
视图模型:
fun resendVerificationCode(activity: Activity)
val options =
PhoneAuthOptions.newBuilder(mAuth)
.setPhoneNumber(_validFullPhoneNumber.value!!) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(activity)
.setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
.setForceResendingToken(_resendToken) // ForceResendingToken from callbacks
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
_isVerificationCodeExpired.value = false
UI 控制器(片段):
viewModel.resendVerificationCode(requireActivity())
【讨论】:
以上是关于如何在视图模型中实现 Firebase 电话身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Firebase 身份验证中实现多用户帐户登录和切换?
如何在 MVVM-C RxSwift 中实现 firebase 身份验证
如何在angular4的firebase电话身份验证中重新发送短信验证?