Kotlin:从 Firebase 实时数据库读取时出错

问题描述 投票:0回答:1

我正在编写一个项目,必须从 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) 

我对此不太了解,希望得到一些帮助。

firebase kotlin firebase-realtime-database
1个回答
0
投票

通过在

!!
中使用
auth.currentUser!!.uid
,你是在说“我确信
auth.curentUser
在这里永远不会是
null
。然后事实证明
auth.curentUser
null
,这就是为什么Kotlin 抛出错误。

在访问

auth.curentUser
属性之前,您需要检查
uid
是否不为空:

if (auth.currentUser != null) {
    dataBase.child(auth.currentUser!!.uid).get().addOnCompleteListener {
        ....
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.