You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用于Activity间数据共享的ViewModel简易示例是否正确?

问题与代码验证

我正尝试实现ViewModel以在Activity间共享数据。作为初学者,我在网上找到的答案大多针对Fragment,对当前水平的我来说略显复杂。因此我参考不同资料编写了以下看似可行的简易方案,想确认该代码是否正确,因为我曾看到有说法称ViewModel无法在两个UI间共享。

ViewModel类

class MyViewModel : ViewModel() {
    var ctr by mutableStateOf(0)
}

导航组件

@Composable
fun Navigateur() {
    val myNavController = rememberNavController()
    val myViewModel = viewModel<MyViewModel>()

    NavHost(navController = myNavController, startDestination = "ecran1" ){
        composable(route = "ecran1"){
            Ecran1(myNavController,myViewModel)
        }
        composable(route = "ecran2"){
            Ecran2(myViewModel)
        }
    }
}

界面1(原标注Activity 1)

@Composable
fun Ecran1(monNavController: NavController, monViewModel: MyViewModel) {
    Column (horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center,
        modifier = Modifier.fillMaxSize()){
        Text(text = monViewModel.ctr.toString(),fontSize = 30.sp,
            modifier = Modifier.background(Color.Cyan)
        )
        Spacer(modifier = Modifier.height(50.dp))
        Button(onClick = { monViewModel.ctr++  }) {
            Text(text = "  增加数值  ")
        }
        Spacer(modifier = Modifier.height(50.dp))
        Button(onClick = { monNavController.navigate("ecran2") }) {
            Text(text = "  跳转至界面2  ")
        }
    }
}

界面2(原标注Activity 2)

@Composable
fun Ecran2(monViewModel: MyViewModel) {
    Column (horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center, modifier = Modifier.fillMaxSize()){
        Text(text = monViewModel.ctr.toString(), fontSize = 30.sp,
            modifier = Modifier.background(Color.Cyan)
        )
        Spacer(modifier = Modifier.height(100.dp))
        Button(onClick = { monViewModel.ctr++ }) {
            Text(text = "  增加数值  ")
        }
    }
}

代码验证与说明

你的代码是可行的,但要先明确一个关键概念:你标注的「Activity 1」「Activity 2」其实是Compose的可组合界面,并非Android传统意义上继承自AppCompatActivity的Activity类。

为什么能实现数据共享?

你在Navigateur可组合函数中创建了MyViewModel实例,这个ViewModel的生命周期绑定的是NavHost所在的宿主(通常是单个Android Activity)。所有在NavHost中注册的可组合界面(Ecran1和Ecran2)都会拿到同一个ViewModel实例,因此修改ctr的值后,两个界面能实时同步数据。

关于“ViewModel无法在两个UI间共享”的说法

这个说法针对的是两个独立的Android Activity(即两个不同的Activity实例)。因为每个Activity都有自己的ViewModelStore,ViewModel的生命周期绑定所属的Activity,所以无法跨Activity实例共享。但你的代码采用的是单Activity+多Compose界面的现代架构,不存在这个问题。

内容的提问来源于stack exchange,提问作者A. Oumnad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:56:19