android - Lateinit 属性尚未初始化
问题描述
我对这段代码有问题。显然我没有初始化 lateinit 变量,但是,在本文发布日期前两周,应用程序运行没有任何问题。如果有人确实在代码上发现错误,或者告诉我这可能是与我的数据库规则相关的错误(我正在使用 firebase 实时),我将非常感激。
以下代码是活动中的 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()
}
}
}
}
解决方案
您需要将它们初始化为 null 或在初始化(开始)处放置一些值。例如:
// 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
推荐阅读
- javascript - Angular 如何将它的字段成员暴露给它的模板?
- python - 如何合并来自同一数据帧的行与空值的混合
- reactjs - 我一直在尝试将 mgt-react 组件集成到我的应用程序中,但它似乎与其他包冲突
- typescript - 打字稿如何使用具有字符串类型参数的方法声明类,该参数是特定类型的派生类的属性名称
- ruby-on-rails - Ruby 获取如何安装特定捆绑器版本
- pandas - 在 pandas 数据帧中,计算 Pandas 数据帧的平均值后清理输出
- c# - 如何制作新的 IEnumerable 集合并返回它?
- excel - 重复剪切和粘贴范围/块/数据(具有不同行的范围由特定字符串确定)
- macos - 适用于 MacOS 的虚拟打印机驱动程序
- javascript - JS先按首都过滤对象数组,然后按字母顺序