#android #kotlin #android-jetpack-compose
Вопрос:
Я реализовал импорт androidx.compose.runtime.*
, как предлагали другие пользователи здесь, но все же я не могу использовать observeAsState для отображения каких-либо значений, например Text(text = weather.main.temp.toString())
, внутри составного элемента.
Составная:
@Composable
fun WeatherAppHomeScreen(weatherViewModel: WeatherViewModel) {
val weather: Weather by weatherViewModel.myResponse.observeAsState()
Text(text = weather.main.temp.toString())
}
Класс данных:
data class Weather(
@SerializedName("base")
val base: String,
@SerializedName("clouds")
val clouds: Clouds,
@SerializedName("cod")
val cod: Int,
@SerializedName("coord")
val coord: Coord,
@SerializedName("dt")
val dt: Int,
@SerializedName("id")
val id: Int,
@SerializedName("main")
val main: Main,
@SerializedName("name")
val name: String,
@SerializedName("rain")
val rain: Rain,
@SerializedName("sys")
val sys: Sys,
@SerializedName("timezone")
val timezone: Int,
@SerializedName("visibility")
val visibility: Int,
@SerializedName("weather")
val weather: List<WeatherX>,
@SerializedName("wind")
val wind: Wind
)
Класс ViewModel:
class WeatherViewModel : ViewModel() {
val myResponse: MutableLiveData<Weather> = MutableLiveData()
fun getWeather() {
viewModelScope.launch {
myResponse.value = retrofit.getWeather()
}
}
}
Ответ №1:
observeAsState()
Функция возвращает необязательное значение. Вы можете объявить его как Weather?
и заменить делегирование простым состоянием, чтобы обеспечить интеллектуальное приведение:
val weatherState: State<Weather?> = weatherViewModel.myResponse.observeAsState()
val weather: Weather? = weatherState.value // allow smart cast
if (weather != null) {
Text(text = weather.main.temp.toString())
}
В некоторых случаях вы можете указать начальное значение(не уверен, применимо ли оно к вашему случаю), которое будет использоваться до тех пор, пока текущие данные не получат значение. В этом случае вывод будет необязательным:
val weather: Weather by weatherViewModel.myResponse.observeAsState(Weather(...))
Text(text = weather.main.temp.toString())