Jetpack Compose使用observeAsState报getValue缺失错误如何解决?
问题解决方案
出现该报错有两个核心原因,按照以下步骤排查即可解决:
- 第一个原因:未添加
observeAsState所需的依赖包
observeAsState是LiveData适配Compose的扩展方法,不属于基础的androidx.compose.runtime包,需要在模块级build.gradle文件中单独引入依赖:
// groovy语法 implementation 'androidx.compose.runtime:runtime-livedata:你的项目对应Compose版本号' // 如果是Kotlin dsl语法 implementation("androidx.compose.runtime:runtime-livedata:你的项目对应Compose版本号")
依赖添加完成后同步Gradle,再确认代码顶部导入了正确的包:
import androidx.compose.runtime.livedata.observeAsState
- 第二个原因:未处理observeAsState的可空返回
如果调用observeAsState时不传初始值,返回的是可空的State<T?>类型,直接赋值给非空的Weather类型会报错,有两种解决方式:- 传入初始默认值:构造一个默认的Weather实例作为初始值传入observeAsState
val weather: Weather by weatherViewModel.myResponse.observeAsState( // 按照你的数据类结构补全所有字段的默认值即可 initial = Weather( base = "", clouds = Clouds(0), cod = 0, coord = Coord(0.0,0.0), dt = 0, id = 0, main = Main(0.0,0,0,0.0,0.0,0.0,0.0), name = "", rain = Rain(0.0), sys = Sys("",0,0,0,0), timezone = 0, visibility = 0, weather = emptyList(), wind = Wind(0.0,0,0.0) ) )- 声明可空类型并判空:这是更稳妥的方式,避免网络请求完成前出现空指针
@Composable fun WeatherAppHomeScreen(weatherViewModel: WeatherViewModel) { // 进入页面时发起网络请求 LaunchedEffect(Unit) { weatherViewModel.getWeather() } // 声明为可空类型 val weather: Weather? by weatherViewModel.myResponse.observeAsState() // 判空处理 if (weather != null) { Text(text = weather!!.main.temp.toString()) } else { // 空状态下展示加载提示 Text(text = "天气数据加载中...") } }
以上两个问题解决后即可正常运行。
内容的提问来源于stack exchange,提问作者kejlor
相关产品推荐
相关产品推荐

