我正在编写一个项目,必须从 firebase 读取一些数据并将它们写入一些文本视图,但是当我尝试打开显示这些数据的活动时,应用程序崩溃了,问题似乎出在我使用.child 然后我用 .get 得到它们。有代码和错误:
代码:
class SchermataUtente : AppCompatActivity() {
private lateinit var binding : ActivitySchermataUtenteBinding
private lateinit var auth : FirebaseAuth
private lateinit var dataBase : DatabaseReference
private lateinit var snapshot: DataSnapshot
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
binding = ActivitySchermataUtenteBinding.inflate(layoutInflater)
setContentView(binding.root)
leggiDataBase()
auth = FirebaseAuth.getInstance()
val disconnetti : Button = findViewById(R.id.Disconnetti)
disconnetti.setOnClickListener {
auth.signOut()
val toLogin = Intent(this, Login::class.java)
startActivity(toLogin)
finish()
}
}
private fun leggiDataBase()
{
dataBase = FirebaseDatabase.getInstance().getReference("Utenti")
dataBase.child(auth.currentUser!!.uid).get().addOnCompleteListener {
if (it.isSuccessful)
{
if (it.result.exists())
{
snapshot = it.result
val textNomeUtente = snapshot.child("nome").value.toString()
val textCognomeUtente = snapshot.child("cognome").value.toString()
val textEmailUtente = snapshot.child("email").value.toString()
binding.SUTextNome.text = textNomeUtente
binding.SUTextCognome.text = textCognomeUtente
binding.SUTextEmail.text = textEmailUtente
}else
{
Toast.makeText(this, "L'utente non esiste!", Toast.LENGTH_LONG).show()
}
}else
{
Toast.makeText(this, "Dati non trovati!", Toast.LENGTH_LONG).show()
}
}
}
override fun onRestart() {
super.onRestart()
if(auth.currentUser != null)
{
Log.d("SchermataUtente", "torno al menu a tendina (restart)")
val toMenuTendina = Intent(this, MenuTendina::class.java)
startActivity(toMenuTendina)
finish()
}
}
override fun finish() {
super.finish()
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right)
}
}
错误:
FATAL EXCEPTION: main
Process: com.example.pizzeriadatot, PID: 30843
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.pizzeriadatot/com.example.pizzeriadatot.SchermataUtente}: kotlin.UninitializedPropertyAccessException: lateinit property auth has not been initialized
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3616)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3780)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2251)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8068)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property auth has not been initialized
at com.example.pizzeriadatot.SchermataUtente.leggiDataBase(SchermataUtente.kt:43)
at com.example.pizzeriadatot.SchermataUtente.onCreate(SchermataUtente.kt:27)
at android.app.Activity.performCreate(Activity.java:8006)
at android.app.Activity.performCreate(Activity.java:7990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3589)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3780)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2251)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8068)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)
我对此不太了解,希望得到一些帮助。
通过在
!!
中使用 auth.currentUser!!.uid
,你是在说“我确信 auth.curentUser
在这里永远不会是 null
。然后事实证明 auth.curentUser
是 null
,这就是为什么Kotlin 抛出错误。
在访问
auth.curentUser
属性之前,您需要检查 uid
是否不为空:
if (auth.currentUser != null) {
dataBase.child(auth.currentUser!!.uid).get().addOnCompleteListener {
....
}
}