Android jetpack 组成observeAsState() 属性委托必须有一个“getValue(Nothing?, KProperty<*>)”

kej*_*lor 4 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())
}
Run Code Online (Sandbox Code Playgroud)

数据类:

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
)
Run Code Online (Sandbox Code Playgroud)

视图模型类:

class WeatherViewModel : ViewModel() {

    val myResponse: MutableLiveData<Weather> = MutableLiveData()
    
    fun getWeather() {
        viewModelScope.launch {
            myResponse.value = retrofit.getWeather()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*hov 6

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())
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您可以指定初始值(不确定它是否适用于您的情况),将使用该初始值直到实时数据具有值。在这种情况下,输出将是非可选的:

val weather: Weather by weatherViewModel.myResponse.observeAsState(Weather(...))
Text(text = weather.main.temp.toString())
Run Code Online (Sandbox Code Playgroud)