我不了解MVVM上的“实例尚未初始化”

时间:2019-12-14 06:05:07

标签: android mvvm

我正在研究Example上的MVVM。 我不理解为什么初始化了变量'instance'却没有初始化 请告诉我... 当我在getInstance()中记录var实例时,在调用时似乎没有被调用。和错误代码 “ lateinit属性mNicePlaces尚未初始化” 我想问题出在这里

    fun getInstance(): NicePlaceRepository {
        if (instance == null) {
            instance = NicePlaceRepository()
        }
        Log.d("TAG","11111")
        return instance
    }

但是我通过单例初始化了该实例...为什么不调用它?我该怎么办?

ViewModel

private lateinit var mNicePlaces :MutableLiveData<List<NicePlace>>
lateinit var mRepository : NicePlaceRepository

fun init(){
    if(mNicePlaces!=null) return
    mRepository =  NicePlaceRepository().getInstance()
    mNicePlaces = mRepository.getNicePlaces()
}

fun getNicePlaces():LiveData<List<NicePlace>>{
    return mNicePlaces
}

存储库

private val dataSet = ArrayList<NicePlace>()
companion object {
    lateinit var instance: NicePlaceRepository
}

fun getInstance(): NicePlaceRepository {
    if (instance == null) {
        instance = NicePlaceRepository()
    }
    Log.d("TAG","11111")
    return instance
}
fun getNicePlaces():MutableLiveData<List<NicePlace>>{
    setNicePlaces()
   var data = MutableLiveData<List<NicePlace>>()
   data.value = dataSet
   return data
}
private fun setNicePlaces(){
    for(i:Int in 0..5){
        dataSet.add(NicePlace("111", "111"))
    }
}

1 个答案:

答案 0 :(得分:1)

由于您已声明lateinit var instance: NicePlaceRepository,因此该实例不能为null。并且您的支票if (instance == null)无法通过,实例也不会启动。

一种解决方法是通过检查Lateinit实例是否已初始化而不是null检查。或使实例为可空:

更改此内容

lateinit var instance: NicePlaceRepository

收件人:

 var instance: NicePlaceRepository? = null

此外,您还必须在getInstance()方法中添加双刘海:

fun getInstance(): NicePlaceRepository {
    if (instance == null) {
        instance = NicePlaceRepository()
    }
    Log.d("TAG","11111")
    return instance!!
}