如何在视图模型中实现 firebase phone auth?

How can firebase phone auth be implemented in view model?

我正在尝试使用 Kotlin 在视图模型中添加 Firebase Phone 身份验证代码。问题是 PhoneAuthProvider 需要 activity。有谁知道如何在不需要 activity 的情况下在视图模型中实现此代码?

谢谢!

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)

原来是API20(check out this issue on Github)中的一个有意改动,尽管它违反了MVVM架构。需要 activity 的原因是该方法回退到 reCAPTCHA。正确的实现方式“待定”。

我的方法是将所有内容都包含在 viewModel 中,包括回调。然后我在 viewModel 中调用一个函数并传入一个 activity 参数。见下文:

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())