【问题标题】:lateinit property response has not been initializedlateinit 属性响应尚未初始化
【发布时间】:2021-08-13 11:52:38
【问题描述】:

我在 init 块中初始化响应但抛出异常:/为什么?

lateinit var response: MutableLiveData<List<AccessListItem?>>


init {
       response.value.apply { emptyList<AccessListItem>() }
}

例外:

kotlin.UninitializedPropertyAccessException: lateinit property response has not been initialized

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您没有在init 块中初始化response(您需要response = something)。你实际上甚至没有初始化response.value。 你实际上在做的是访问response.value,这需要访问response,因为response从未被初始化过而失败。

    您需要在init 块或属性声明中初始化response。最有可能使用 MutableLiveData() 构造函数,或任何其他获取实时数据的方式。

    例如,您可以这样初始化属性:

    val response = MutableLiveData<List<AccessListItem?>>()
    

    请注意,您不再需要lateinitvar,只需一个简单的val,因为您不需要更改response(实时数据)本身,而只需更改它的值。

    为了赋予它一些价值,你需要设置response.value。你可以通过response.value = emptyList() 做到这一点。现在这段代码可以像您尝试的那样放在init 块中:

    val response = MutableLiveData<List<AccessListItem?>>()
    
    init {
        response.value = emptyList()
    }
    

    但是你也可以在初始化response属性的时候直接使用作用域函数apply来进行这个操作:

    val response = MutableLiveData<List<AccessListItem?>>().apply {
        value = emptyList()
    }
    

    【讨论】:

      【解决方案2】:

      发生的情况是您在没有实际初始化实时数据的情况下将值设置为字段

      设置

      init {
             response.value.apply { emptyList<AccessListItem>() }
      }
      

        init {
                response = MutableLiveData()
                 response.value.apply { emptyList<AccessListItem>() }
          }
      

      【讨论】:

        猜你喜欢
        • 2017-03-03
        • 1970-01-01
        • 2020-12-31
        • 2021-06-11
        • 2017-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多