kotlin.UninitializedPropertyAccessException:Firebase数据添加失败排查
解决
kotlin.UninitializedPropertyAccessException错误:Firebase数据添加失败问题 问题描述
尝试向Firebase Firestore添加金额、地点、时间及用户ID数据时,应用崩溃并抛出kotlin.UninitializedPropertyAccessException: lateinit property postDao has not been initialized错误,数据无法成功写入Firebase。
错误原因
在MainActivity中使用lateinit关键字声明了postDao变量,但从未对其进行初始化就直接调用postDao.addPost()方法。Kotlin的lateinit要求变量必须在使用前完成实例化,否则会触发该异常。
解决方案
在MainActivity的onCreate方法中初始化postDao实例,确保调用addPost前变量已被正确初始化。
修改后的MainActivity.kt
class MainActivity : AppCompatActivity() { private lateinit var postDao: PostDao override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化postDao实例 postDao = PostDao() add.setOnClickListener { val input1 = enterAmount.text.toString().trim() val input2 = spendLocation.text.toString().trim() if(input1.isNotEmpty() && input2.isNotEmpty()){ postDao.addPost(input1,input2) } } } }
额外优化建议
- 避免使用
GlobalScope:GlobalScope.launch不适合Android场景,建议改用lifecycleScope(需依赖androidx.lifecycle:lifecycle-runtime-ktx),它会与Activity生命周期绑定,防止内存泄漏:// 修改PostDao的addPost方法,传入LifecycleCoroutineScope fun addPost(text1:String, text2: String, lifecycleScope: LifecycleCoroutineScope){ val currentUser = auth.currentUser ?: run { // 用户未登录的处理逻辑,比如跳转登录页 return@addPost } val currentUserId = currentUser.uid lifecycleScope.launch { val userDao = UserDao() val user = userDao.getUserById(currentUserId).await().toObject(User::class.java) ?: return@launch val currentTime = System.currentTimeMillis() val post = Post(text1, user, currentTime,text2) postCollections.document().set(post) } } // 在MainActivity中调用时传入lifecycleScope postDao.addPost(input1,input2, lifecycleScope) - 空安全处理:移除
!!强制非空断言,增加空值判断,避免潜在的空指针异常。
内容的提问来源于stack exchange,提问作者Ajay Satpati
相关产品推荐
相关产品推荐

