Я использую 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
Что я здесь делаю неправильно? и правильный ли поток, которому я следую?
они определены как латентные переменные в классе, и я установил их в onCodeSent. обновил вопрос. @DougStevenson
Я вообще не вижу никаких lateinit варов. Пожалуйста, отредактируйте вопрос, чтобы показать полный минимальный код. Не просто описывайте это - скопируйте код в свой вопрос, чтобы мы могли видеть, что видит компилятор.
Извини за это. Я только что обновил вопрос и опубликовал всю активность @DougStevenson.
Среда выполнения 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.
}
}
Мы не видим здесь, где объявлено
storedVerificationId
, поэтому мы не можем знать, как это исправить. Сообщение об ошибке исходит от компилятора Kotlin и не имеет ничего общего с тем, как работает Firebase. Пожалуйста, отредактируйте вопрос, чтобы сосредоточиться на исходном коде, связанном сstoredVerificationId
. Он должен содержать полный минимальный пример кода, который работает не так, как вы ожидаете.