【问题标题】:Android jetpack compose observeAsState() Property delegate must have a 'getValue(Nothing?, KProperty<*>)'Android jetpack compose observeAsState() 属性委托必须有一个 'getValue(Nothing?, KProperty<*>)'
【发布时间】:2021-09-22 22:38:15
【问题描述】:

我已经按照此处其他用户的建议实现了 import 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()
        }
    }
}

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 2022-11-17
      • 2013-03-08
      • 1970-01-01
      • 2021-06-08
      相关资源
      最近更新 更多