Авторизация firebase по номеру телефона

Я использую Firebase и пытаюсь зарегистрировать пользователей с помощью телефонной аутентификации.

вот мой полный код активности

class RegisterActivity : AppCompatActivity(){
 private val auth = FirebaseAuth.getInstance()
    private val timeoutSeconds = 60L
    private lateinit var storedVerificationId: String
    private lateinit var resendToken: PhoneAuthProvider.ForceResendingToken

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)
        registerbtn.setOnClickListener { registerButtonClicked() }
        verifybtn.setOnClickListener { verifyButtonClicked() }
    }
fun registerButtonClicked() {
        registerPhoneNumber(editTextPhone.text.toString())
    }
private fun verifyButtonClicked() {
       verifyUser(editTextPhone.text.toString())
    }
private fun registerPhoneNumber(phoneNumber: String) {
        val options = PhoneAuthOptions.newBuilder(auth)
            .setPhoneNumber(phoneNumber) 
            .setTimeout(timeoutSeconds, TimeUnit.SECONDS)
            .setActivity(activity)           
            .setCallbacks(callbacks)  
            .build()
        PhoneAuthProvider.verifyPhoneNumber(options)
    }

private val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            signInWithPhoneAuthCredential(credential)
        }

        override fun onVerificationFailed(e: FirebaseException) {
                   }

        override fun onCodeSent(
            verificationId: String,
            token: PhoneAuthProvider.ForceResendingToken
        ) {
            storedVerificationId = verificationId
            resendToken = token
        }
    }

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
        auth.signInWithCredential(credential)
            .addOnCompleteListener(activity) { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "signInWithCredential:success")
                } 
            }
    }

fun verifyUser(verificationCode: String) {
        val credential = PhoneAuthProvider.getCredential(storedVerificationId, verificationCode)
        signInWithPhoneAuthCredential(credential)
    }

У меня есть исключение, что storedVerificationId не было установлено, хотя я уже установил его в onCodeSent Что я здесь делаю неправильно? и правильный ли поток, которому я следую?

Мы не видим здесь, где объявлено storedVerificationId, поэтому мы не можем знать, как это исправить. Сообщение об ошибке исходит от компилятора Kotlin и не имеет ничего общего с тем, как работает Firebase. Пожалуйста, отредактируйте вопрос, чтобы сосредоточиться на исходном коде, связанном с storedVerificationId. Он должен содержать полный минимальный пример кода, который работает не так, как вы ожидаете.

Doug Stevenson 25.12.2020 00:24

они определены как латентные переменные в классе, и я установил их в onCodeSent. обновил вопрос. @DougStevenson

Remon Shehatta 25.12.2020 00:26

Я вообще не вижу никаких lateinit варов. Пожалуйста, отредактируйте вопрос, чтобы показать полный минимальный код. Не просто описывайте это - скопируйте код в свой вопрос, чтобы мы могли видеть, что видит компилятор.

Doug Stevenson 25.12.2020 00:59

Извини за это. Я только что обновил вопрос и опубликовал всю активность @DougStevenson.

Remon Shehatta 25.12.2020 01:35
0
4
274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Среда выполнения Kotlin выдает вам это сообщение, потому что она увидела, что этому storedVerificationId не было присвоено ненулевое значение до того, как оно было использовано в verifyUser.

Скорее всего, вы просто захотите удалить из него ключевое слово lateinit и разрешить нулевое начальное значение. Вам нужно будет проверить значение null, чтобы убедиться, что оно установлено, прежде чем использовать его.

    private var storedVerificationId: String? = null


    fun verifyUser(verificationCode: String) {
        if (storedVerificationId != null) {
            val credential = PhoneAuthProvider.getCredential(storedVerificationId, verificationCode)
            signInWithPhoneAuthCredential(credential)
        }
        else {
            // decide what you want to do if it hasn't been given a value yet.
        }
    }

Другие вопросы по теме