首页 > 解决方案 > LiveData 和 Coroutines - 属性必须被初始化或抽象

问题描述

我正在尝试在 MVVM 中同时使用 LiveData 和 Coroutines,我可能会遗漏一些简单的东西。

class WeatherViewModel (
    private val weatherRepository: ForecastRepository
) : ViewModel() {

    var weather: LiveData<Weather>;

    /**
     * Cancel all coroutines when the ViewModel is cleared.
     */
    @ExperimentalCoroutinesApi
    override fun onCleared() {
        super.onCleared()
        viewModelScope.cancel()
    }


    init {
        viewModelScope.launch {
            weather = weatherRepository.getWeather()
        }

    }

}

但我正在Property must be initialized or be abstract分配weatherininit函数。我假设是这种情况,因为我正在使用 coroutines viewModelScope.launch

override suspend fun getWeather(): LiveData<Weather> {
    return withContext(IO){
       initWeatherData()
       return@withContext weatherDao.getWeather()
    }
}

我该如何解决?

标签: androidkotlinkotlin-coroutinesandroid-livedatacoroutine

解决方案


您可以将weather属性声明为lateinit

private lateinit var weather: LiveData<String>

或者让它可以为

private var weather: LiveData<String>? = null

如果您确定该属性将在您第一次使用它之前被初始化,lateinit否则将其设为nullable


推荐阅读