Lateinit 属性尚未初始化

时间:2021-05-21 20:03:35

标签: android firebase kotlin firebase-realtime-database

这段代码有问题。显然我没有初始化 lateinit 变量,但是,在本出版物发布日期前两周,该应用程序运行没有任何问题。如果有人确实在代码中发现错误,或者告诉我这可能是与我的数据库规则相关的错误(我正在使用 firebase realtime),我将非常感激。

以下代码是活动的 onCreate 方法:

class PostCreation : AppCompatActivity() {

// Creacion de variables importantes
private lateinit var binding: ActivityPostCreationBinding
private lateinit var baseDatos: FirebaseDatabase
private lateinit var auth: FirebaseAuth

// Datos de usuario
private lateinit var userName: String
private lateinit var userMail: String
private lateinit var userImage: String
private lateinit var uid: String

// Permisos para fotografias
private val CAMERA_REQUEST_CODE = 100
private val STORAGE_REQUEST_CODE = 200
private val IMAGE_CAMERA_CODE = 300
private val IMAGE_GALLERY_CODE = 400
private lateinit var cameraPermission: Array<String>
private lateinit var storagePermission: Array<String>
private var image_uri: Uri? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityPostCreationBinding.inflate(layoutInflater)
    setContentView(binding.root)

    baseDatos = FirebaseDatabase.getInstance()
    auth = Firebase.auth

    cameraPermission = arrayOf(android.Manifest.permission.CAMERA,
                                android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
    storagePermission = arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)

    obtenerImagen()
    configurarDropDown()
    obtenerDatos()
    configurarBotones()
}

我在这里初始化变量,在 obtenerDatos() 方法中:

    private fun obtenerDatos() {
    val user = auth.currentUser!!
    uid = user.uid
    userMail = user.email!!
    println("Hola")
    val dbPath = baseDatos.getReference("Users")
    val query = dbPath.orderByChild("userMail").equalTo(userMail)
    val eventListener = object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            for(ds in snapshot.children){
                userName = "" + ds.child("username").value
                userMail = "" + ds.child("userMail").value
                userImage = "" + ds.child("dirImagen").value
            }
        }

        override fun onCancelled(error: DatabaseError) {
            Toast.makeText(baseContext, "Algo salió mal al momento de publicar tu post. Intenta más tarde.",
                Toast.LENGTH_LONG).show()
        }

    }
    query.addValueEventListener(eventListener)
}

接下来是出现错误的代码段:

   private fun subirDatos(postText: String, postType: String, image: String) {
    val timeStamp = System.currentTimeMillis().toString()
    val path = "Posts/post_$timeStamp"
    val pd = ProgressDialog(this)
    pd.setMessage("Publicando...")
    pd.show()

    if(image != "noImage"){
        val ref = FirebaseStorage.getInstance().reference.child(path)
        ref.putFile(Uri.parse(image)).addOnSuccessListener{ takeSnapshot ->

            val uriTask = takeSnapshot.storage.downloadUrl
            while (!uriTask.isSuccessful);
            val downloadUri = uriTask.result.toString()

            if(uriTask.isSuccessful){
                val hashMap = HashMap<Any, String>()
                hashMap["uid"] = uid
                hashMap["username"] = userName  // THIS SHOWS ERROR
                hashMap["userMail"] = userMail
                hashMap["dirImagen"] = userImage    // THIS SHOWS ERROR
                hashMap["postID"] = timeStamp
                hashMap["postText"] = postText
                hashMap["postType"] = postType
                hashMap["postImage"] = downloadUri
                hashMap["postTime"] = timeStamp

                // Path to store post data
                val ref2DB = FirebaseDatabase.getInstance().getReference("Posts")
                ref2DB.child(timeStamp).setValue(hashMap).addOnSuccessListener {
                    pd.dismiss()
                    Toast.makeText(this, "Post publicado", Toast.LENGTH_SHORT).show()
                    finish()
                }.addOnFailureListener{ exception: Exception ->
                    pd.dismiss()
                    Toast.makeText(this, ""+exception.message, Toast.LENGTH_SHORT).show()
                }
            }
        }.addOnFailureListener{exception: Exception ->
            pd.dismiss()
            Toast.makeText(this, ""+exception.message, Toast.LENGTH_SHORT).show()
        }
    } else {
        val hashMap = HashMap<Any, String>()
        hashMap["uid"] = uid
        hashMap["username"] = userName  // THIS SHOWS ERROR. Line 162
        hashMap["userMail"] = userMail
        hashMap["dirImagen"] = userImage  // THIS SHOWS ERROR
        hashMap["postID"] = timeStamp
        hashMap["postText"] = postText
        hashMap["postType"] = postType
        hashMap["postImage"] = "noImage"
        hashMap["postTime"] = timeStamp

        // Path to store post data
        val ref2DB = FirebaseDatabase.getInstance().getReference("Posts")
        ref2DB.child(timeStamp).setValue(hashMap).addOnSuccessListener {
            pd.dismiss()
            Toast.makeText(this, "Post publicado", Toast.LENGTH_SHORT).show()
            finish()
        }.addOnFailureListener{ exception: Exception ->
            pd.dismiss()
            Toast.makeText(this, ""+exception.message, Toast.LENGTH_SHORT).show()
        }
    }
}

文章编辑

嘿!感谢您及时的回复!错误日志如下所示:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: mx.itesm.ETeam.Elink, PID: 15537
kotlin.UninitializedPropertyAccessException: lateinit property userName has not been initialized
    at mx.itesm.ETeam.Elink.PostsRelated.PostCreation.subirDatos(PostCreation.kt:162)
    at mx.itesm.ETeam.Elink.PostsRelated.PostCreation.access$subirDatos(PostCreation.kt:30)
    at mx.itesm.ETeam.Elink.PostsRelated.PostCreation$configurarBotones$1.onClick(PostCreation.kt:83)
    at android.view.View.performClick(View.java:7448)
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
    at android.view.View.performClickInternal(View.java:7425)
    at android.view.View.access$3600(View.java:810)
    at android.view.View$PerformClick.run(View.java:28305)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

其他方法也是这样:

    private fun configurarDropDown() {
    val type = resources.getStringArray(R.array.tipoPost)
    val adapter = ArrayAdapter(this, R.layout.dropdown_item, type)
    binding.autoType.setAdapter(adapter)
}

private fun configurarBotones(){
    //obtenerImagen()
    binding.postButton.setOnClickListener{
        val postText = binding.post.text.toString().trim()
        val postType = binding.autoType.text.toString()
        if(revisarDatos(postText, postType)){
            if(image_uri == null){
                subirDatos(postText, postType, "noImage")
                //finish()
            } else {
                subirDatos(postText, postType, image_uri.toString())
                //finish()
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您需要初始化它们,它要么为空,要么在初始化(开始)时放置一些值。例如:

// Datos de usuario
private lateinit var userName: String? = null
private lateinit var userMail: String? = null
private lateinit var userImage: String? = null
private lateinit var uid: String? = null