Делегат свойства Android jetpack compose observeAsState() должен иметь значение ‘ GetValue(ничего?, свойство KProperty)’

#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())