用于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
相关产品推荐
相关产品推荐

