Android Compose:仅在Composable首次打开时调用一次ViewModel函数
解决Compose配置变更重复调用接口的问题
方法一:利用ViewModel的生命周期(推荐)
把接口调用逻辑放到ViewModel的初始化块里,因为ViewModel的生命周期不受设备旋转、明暗模式切换这类配置变更的影响——页面首次创建时ViewModel初始化一次,配置变更时ViewModel会被系统保留,不会重新初始化,所以接口只会被调用一次。
示例代码:
class MyScreenViewModel : ViewModel() { init { // 在这里执行列表/详情接口请求 fetchRequiredData() } private fun fetchRequiredData() { // 实际的接口调用逻辑,比如用Retrofit或OkHttp发起请求 } } // 在Compose页面中使用 @Composable fun MyScreen(viewModel: MyScreenViewModel = viewModel()) { // 界面渲染逻辑,基于ViewModel中的数据更新UI }
方法二:用rememberSaveable控制执行时机
如果不想依赖ViewModel,可以通过rememberSaveable保存一个是否已请求过数据的标记,配合LaunchedEffect实现仅首次加载时调用接口。rememberSaveable会在配置变更后保留状态,所以标记不会重置,避免重复执行。
示例代码:
@Composable fun MyScreen() { val hasFetchedData = rememberSaveable { mutableStateOf(false) } LaunchedEffect(Unit) { if (!hasFetchedData.value) { // 调用接口获取数据 fetchData() hasFetchedData.value = true } } // 界面渲染逻辑 } private suspend fun fetchData() { // 接口请求逻辑 }
这两种方法都能有效避免配置变更时重复调用接口,其中ViewModel的方式更符合Jetpack Compose的架构规范,推荐优先使用。
内容的提问来源于stack exchange,提问作者Dhruv Pandya
相关产品推荐
相关产品推荐

