【问题标题】:Kotlin View Binding java.lang.IllegalStateException: view must not be null inside listenerKotlin 视图绑定 java.lang.IllegalStateException:视图在侦听器中不能为空
【发布时间】:2019-04-29 19:26:55
【问题描述】:

我正在使用来自 Kotlin Android 扩展的View Binding

import kotlinx.android.synthetic.main.fragment_user_profile.*

我想在 片段 中显示来自 Cloud Firestore 的值:

FirebaseFirestore.getInstance()
    .collection("users")
    .document("1")
    .get()
    .addOnSuccessListener { doc ->
        my_text_view.text = doc["name"] as String
    }

如果在接收到数据时仍然显示片段,则它可以工作。但是如果用户关闭片段(按回)接收到数据之前,它会崩溃:

java.lang.IllegalStateException: my_text_view must not be null

如何避免这种情况?


当然我可以使用my_text_view?.text = ... 但是

  • 总有一天我会忘记输入?

  • 没有解决fragment销毁后监听器还活着的问题

我想我想要 addOnSuccessListener(Activity, OnSuccessListener) 这样的东西,但要使用 Fragment 而不是 Activity

【问题讨论】:

  • my_text_view 是 Kotlin 视图绑定自动创建的扩展属性

标签: android firebase kotlin google-cloud-firestore kotlin-android-extensions


【解决方案1】:

如果片段仍被添加到其宿主活动中,您可以检查您的回调,

FirebaseFirestore.getInstance()
.collection("users")
.document("1")
.get()
.addOnSuccessListener { doc ->
    if (isAdded) {
        my_text_view.text = doc["name"] as String
    }
}

但是,更好的解决方案是将您的业务逻辑移至视图模型。

【讨论】:

  • 在我看来 if (isAdded) 实际上与 my_text_view 空检查相同(请参阅我的问题编辑)
  • 如果我将业务逻辑移动到视图模型,我应该在片段关闭时取消订阅监听器吗?
  • 如果您使用 ViewModel,那么您可以使用 LiveData 监听 viewmodel 的数据,它会自动处理片段生命周期,因此您不必担心订阅/取消订阅会自动发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2014-02-12
相关资源
最近更新 更多