weather
должен быть инициализирован с созданием экземпляра класса, потому что вы не сказали, что он может быть нулевым, и вы не используете ключевое слово lateinit
(что в данном случае не следует).
launch
- это асинхронный вызов сопрограммы, который немедленно возвращается, но будет выполнен в какой-то момент в будущем. Это означает, что ваш блок init
завершается и возвращается без инициализации weather
.
Вместо этого используйте runBlocking
. Это будет блокировать до тех пор, пока вы не получите результат в блоке init
, и, таким образом, гарантируете, что погода не будет нулевой при создании экземпляра. Что-то вроде:
init {
weather = runBlocking {
weatherRepository.getWeather()
}
}
Вы также можете передать любой когда-либо диспетчер контекста сопрограмм в runBlocking
.
Или - придерживайтесь сопрограммы, но присоединяйтесь к блоку инициализации, как:
init {
val job = viewModelScope.launch {
weather = weatherRepository.getWeather()
}
job.join()
}