当前位置: 首页 > news >正文

android 多个viewmodel之间通信

       多个viewmodel之间的通信有多种方法,比如通过resposity将sharedviewmodel作为参数传递,进而完成数据通信,也可以通过一个公共的全局变量进行数据传递。本文中提供一个以singleton单例的方式进行。

1.创建单例的resposity类。

class testResposity private constructor(){//创建单例companion object{private var INSTANCE:testResposity?=null@Synchronizedfun getInstance():testResposity{if(INSTANCE==null)INSTANCE = testResposity()return INSTANCE!!}}//以下为业务逻辑val data = MutableStateFlow<String>("")val _counter1 = MutableStateFlow<Int>(0)val counter1 = _counter1.asStateFlow()fun updateCounter1(){_counter1.value++if(_counter1.value==2){data.value = "second"}else if(_counter1.value == 3){data.value = "third"}}
}

2.创建测试的viewmodel1

class TestViewModel1:ViewModel() {//获取resposity单例private val resposity = testResposity.getInstance()val data = resposity.data//调用测试逻辑public fun updateCounter1(){resposity.updateCounter1()}
}

3.按照相同的方式,创建测试的viewmodel2

class TestViewModel2:ViewModel() {private val resposity = testResposity.getInstance()val counter = resposity.counter1public fun updateCounter(){resposity.updateCounter1()}
}

4.测试的compose

@Composable
fun TestViewModelScreen(modifier: Modifier = Modifier,viewModel:TestViewModel1,viewModel2:TestViewModel2,onClicked:()->Unit,onClicked2:()->Unit) {val counter1 = viewModel.data.collectAsState()val counter2 = viewModel2.counter.collectAsState();Column {Text(text = counter1.value.toString())Text(text = counter2.value.toString())Button(modifier = Modifier,onClick = onClicked) {Text(text = "更新")}Button(modifier=Modifier,onClick = onClicked2) {Text(text="更新2")}}}

5.Activity中调用代码

var viewModel1=ViewModelProvider(this).get(TestViewModel1::class.java)var viewModel2 = ViewModelProvider(this).get(TestViewModel2::class.java)TestViewModelTheme {Surface(modifier = Modifier.fillMaxSize(),){Row (modifier = Modifier.fillMaxSize(),verticalAlignment = Alignment.CenterVertically,horizontalArrangement = Arrangement.Center){TestViewModelScreen(viewModel = viewModel1,viewModel2=viewModel2,onClicked = {viewModel1.updateCounter1()},onClicked2 = {viewModel2.updateCounter()})}}}

6.结果

通过两个不同的viewModel,可以对仓库类中的一个变量进行操作,并同步可显示双方操作结果。

相关文章:

  • Math.round(),Math.ceil(),Math.floor(),Math.sqrt(),Math.pow(),Math.abs()等!
  • Redis专题
  • 深度学习框架PyTorch——从入门到精通(3.3)YouTube系列——自动求导基础
  • 在Cursor编辑器上部署MCP(Minecraft Coder Pack)完整指南
  • PyTorch与TensorFlow模型全方位解析:保存、加载与结构可视化
  • 使用go-git同步文件到gitee
  • 【OSG学习笔记】Day 5: 坐标系与变换节点(Transform)
  • Spark-SQL(四)
  • C++之unordered封装
  • MyBatis框架—xml映射
  • 可穿戴设备待机功耗需降至μA级但需保持实时响应(2万字长文深度解析)
  • Android Studio打开xml布局文件内存会快速增加如何设置
  • C语言复习笔记--字符函数和字符串函数(下)
  • Unity接入安卓SDK(3)厘清Gradle的版本
  • 第六章.java集合与泛型
  • UML 状态图:解锁电子图书馆管理系统的高效设计
  • android的 framework 有哪些知识点和应用场景
  • 一键部署k8s之EFK日志收集系统
  • 在 Android 中实现通话录音
  • Flask API 项目 Swagger 版本打架不兼容
  • 全球安全倡议提出三周年,外交部介绍有关情况
  • 路面突陷大坑致车毁人亡,家属称不知谁来管,长治当地回应
  • 中国房地产报:以改促治实现楼市多难并解
  • 人民日报头版:各地扎实开展学习教育,一体推进学查改
  • 美伊第二轮核问题间接谈判结束,伊方称“结果是建设性的”
  • 李家超:香港特区政府积极推进十五运会各项筹办工作