感謝您閱讀這篇文章。我目前正在片段中為我的 Kotlin 應用程式實作電話 OTP。由于沒有可用于 Fragment 且主要用于 Activity 的資源,因此,我將 Activity OTP 應用到我的 Fragment 中,并且正如預期的那樣,一旦我在那里輸入手機號碼并輸入登錄按鈕,它就會崩潰。一旦按下登錄按鈕并插入手機號碼,它就會進入 OTP 活動。
你能從我下面的代碼中找到為什么它會崩潰一次嗎?太感謝了。
package com.example.myApp
import android.content.Intent
import android.os.Bundle
import android.text.Editable
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.Toast
import com.example.myApp.databinding.FragmentLogInPhoneBinding
import com.google.firebase.FirebaseException
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.PhoneAuthCredential
import com.google.firebase.auth.PhoneAuthOptions
import com.google.firebase.auth.PhoneAuthProvider
import kotlinx.android.synthetic.main.fragment_log_in_phone.*
import java.util.concurrent.TimeUnit
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
class LogInPhone : Fragment() {
private lateinit var binding: FragmentLogInPhoneBinding
lateinit var auth: FirebaseAuth
lateinit var storedVerificationId:String
lateinit var resendToken: PhoneAuthProvider.ForceResendingToken
private lateinit var callbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLogInPhoneBinding.inflate(layoutInflater, container, false)
binding.loginButtonPhone.setOnClickListener {
login()
}
callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
override fun onVerificationCompleted(credential: PhoneAuthCredential) {
startActivity(Intent(getActivity()?.applicationContext, MainScreen::class.java))
getActivity()?.finish()
}
override fun onVerificationFailed(e: FirebaseException) {
Toast.makeText(getActivity()?.applicationContext, "Failed", Toast.LENGTH_LONG).show()
}
override fun onCodeSent(
verificationId: String,
token: PhoneAuthProvider.ForceResendingToken
) {
Log.d("TAG","onCodeSent:$verificationId")
storedVerificationId = verificationId
resendToken = token
var intent = Intent(getActivity()?.applicationContext,OTPVerificationPhone::class.java)
intent.putExtra("storedVerificationId",storedVerificationId)
startActivity(intent)
}
}
return binding.root
}
private fun login() {
var number=binding.loginPhoneFragment.text
if(!number.isNullOrEmpty()){
sendVerificationcode (number)
}else{
login_phone_fragment_layout.setError("Masukkan nomor ponsel anda")
}
}
private fun sendVerificationcode(number: Editable?) {
val options = PhoneAuthOptions.newBuilder(auth)
.setPhoneNumber(number.toString()) // Phone number to verify
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(this.requireActivity()) // Activity (for callback binding)
.setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
.build()
PhoneAuthProvider.verifyPhoneNumber(options)
}
companion object {
fun newInstance(param1: String, param2: String) =
LogInPhone().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
順便說一下,這是原始 Activity 源代碼:https ://blog.codestormx.in/#/blog/Surya VMDS#OAZIadP0VivRQTzAuwrb
這是崩潰日志:
2022-02-15 15:13:40.592 7134-7134/com.example.myApp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myApp, PID: 7134
kotlin.UninitializedPropertyAccessException: lateinit property auth has not been initialized
at com.example.myApp.LogInPhone.getAuth(LogInPhone.kt:29)
at com.example.myApp.LogInPhone.sendVerificationcode(LogInPhone.kt:107)
at com.example.myApp.LogInPhone.login(LogInPhone.kt:101)
at com.example.myApp.LogInPhone.onCreateView$lambda-3(LogInPhone.kt:63)
at com.example.myApp.LogInPhone.$r8$lambda$8agyy8FyIIE4Tmrzi_lrnbT4nrs(Unknown Source:0)
at com.example.myApp.LogInPhone$$ExternalSyntheticLambda0.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:7792)
at android.widget.TextView.performClick(TextView.java:16045)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1131)
at android.view.View.performClickInternal(View.java:7769)
at android.view.View.access$3800(View.java:910)
at android.view.View$PerformClick.run(View.java:30184)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8582)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:563)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
2022-02-15 15:13:40.626 7134-7134/com.example.myApp I/Process: Sending signal. PID: 7134 SIG: 9
uj5u.com熱心網友回復:
lateinit var auth: FirebaseAuth
auth 變數未初始化,當您呼叫 sendVerificationcode() 方法時,
PhoneAuthOptions.newBuilder(auth)
auth 為空,因此 UninitializedPropertyAccessException
您可以通過初始化 auth 變數 onCreate 或 onCreateView 來解決此問題
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
auth = FirebaseAuth.getInstance(); // initialized
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429606.html
上一篇:在片段上實作帶有回呼的介面
