Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用_jetpack compose viewmodel-程序员宅基地

技术标签: compose  jetpack  android  

Compose可以配合多个Jetpack组件使用

Compose可以配合多个Jetpack组件开发提高开发效率

多种组合方式

Compose配合ViewModel使用

概述

ComposeViewModel的使用和Jetpack一致,通常我们构建页面的时候,如果一条数据多个布局都需要使用到的话我们只能在方法的形参中层层传递。但是这样明显是不合理的,会降低代码的可读性。

使用ViewModel可以完美的解决这个问题,Compose中使用ViewModel的话需要引入lifecycle-viewmodel-compose库,获取ViewModel的方式需要用到扩展函数:viewModel()

多个@Composable修饰的函数里面使用viewModel()获取ViewModel可以获取到同一个ViewModel对象,这就是我们能解决问题的根本原因

以上所说仅限于同一个导航页中。如果是在不同的导航页中,那么获取到的ViewModel是不同的对象,这一点跟我们不同Activity中获取不同ViewModel是一样的

依赖支持

implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07'

代码

@Composable
fun useWithViewModel() {
    
    val datas = remember {
    
        mutableStateListOf(
            ItemData(title = "向ViewModel中的值自增1并展示", content = "0")
        )
    }
    val model: ExampleViewModel = viewModel()//获取ViewModel对象
    Scaffold(topBar = {
    
        buildTopBar(title = "Compose和ViewModel的结合")
    }) {
    
        ListView(
            datas = datas,
            state = rememberLazyListState(),
            click = {
     itemData: ItemData, index, _ ->
                model.increase()//ViewModel中对象自增1
                itemData.content = model.count.toString()//刷新数据
                changeData(datas, index)
            })
    }
}

ExampleViewModel对象

class ExampleViewModel: ViewModel() {
    
    fun increase() {
    
        count++
    }

    var count =0
}

数据流Flow

概述

Compose可以在不导入依赖的情况下使用Flow,用法基本与相同。不过Compose中使用StateFlow不需要我们在协程中开启collect收集数据流,使用的时候直接使用Flow.collectAsState即可获取到StateFlow中的值进行展示。

示例代码

下面代码使用了MutableStateFlow实现了数据监听,当更新MutableStateFlow值的时候函数会被刷新,然后使用collectAsState即可获取到最新值进行展示。

点击下面的按钮改变值,上面的按钮内容被改变展示效果


@Composable
fun useStateFlow() {
    
    var repository = remember {
    
        Repository()
    }
    Column {
    
        listItem(
            itemData = ItemData(
                title = "点击更改StateFlow的值",
                content = repository.stateFlow.collectAsState().value//获取StateFlow中的值展示
            ), onClick = {
    
            })
        changeUiWithState(repository)
    }

}

@Composable
fun changeUiWithState(repository: Repository) {
    
    listItem(itemData = ItemData(title = "点击改变数据"), onClick = {
    
        repository.increase()//点击数值自增1
    })
}

class Repository {
    
    val stateFlow = MutableStateFlow("初始值0")
    var count = 0
    fun increase(): Int {
    
        stateFlow.value = count.toString()//更改StateFlow中的值
        return count++
    }
}

运行效果

Hilt

初学者可以将Hilt的学习延后,Hilt不是学习Compose的充要条件

hilt的使用和传统开发基本一致,可以查看我的另一篇文章:https://juejin.cn/post/6967148539277213733

coil

coil是一个图片库,可以用来加载Compose中的远程图片

依赖

implementation 'io.coil-kt:coil-compose:1.3.2'

代码

@Composable
fun useCoil() {
    
    val painter =
        rememberImagePainter(data = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201501%2F27%2F20150127103509_KvXhU.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631501719&t=9653a6a5bb4e29505b9b582c770b42ef",
            builder = {
    
                crossfade(true)
            })
    Image(
        modifier = Modifier
            .size(300.dp)
            .clip(shape = RoundedCornerShape(20.dp)),
        painter = painter,
        contentDescription = ""
    )
}

各种效果

圆形效果展示
 rememberImagePainter(data = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201501%2F27%2F20150127103509_KvXhU.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631501719&t=9653a6a5bb4e29505b9b582c770b42ef",
            builder = {
    
                transformations(CircleCropTransformation())
            })

圆角效果
  rememberImagePainter(data = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201501%2F27%2F20150127103509_KvXhU.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631501719&t=9653a6a5bb4e29505b9b582c770b42ef",
            builder = {
    
                transformations(
                    RoundedCornersTransformation()
                )
            })

圆形加灰色效果
  val painter =
        rememberImagePainter(data = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201501%2F27%2F20150127103509_KvXhU.jpeg&refer=http%3A%2F%2Fb-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631501719&t=9653a6a5bb4e29505b9b582c770b42ef",
            builder = {
    
                transformations(
                    listOf(GrayscaleTransformation(), CircleCropTransformation())
                )
            })

关注公众号学习更多知识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ymeddmn/article/details/119702243

智能推荐

使用 ARFoundation 实现 AR 虚拟试戴_ar试帽项目-程序员宅基地

文章浏览阅读336次。在 Hierarchy 面板中右键点击 “AR Session” 对象,选择 “XR” -> “AR Session Origin”,将其添加为 “AR Session” 的子对象。首先,打开 Unity,并在 Hierarchy 面板中右键点击创建一个空对象,将其命名为 “AR Session”。在 Inspector 面板中选择 “AR Session Origin” 对象,然后在右侧的 Inspector 面板中找到 “AR Session Origin” 组件的 “AR Session” 字段。_ar试帽项目

探索T-Writer.js:一款强大的Web文本编辑器-程序员宅基地

文章浏览阅读320次,点赞3次,收藏6次。探索T-Writer.js:一款强大的Web文本编辑器项目地址:https://gitcode.com/ChrisCavs/t-writer.jsT-Writer.js 是一个基于JavaScript的开源富文本编辑器,旨在提供一种简洁、高效的在线写作体验。它具备现代Web应用所需的多种功能,并且易于集成到你的网站或应用中。技术分析T-Writer.js 使用了最新的Web技术栈,包括:...

[PHP]学生成绩管理系统_php成绩管理系统-程序员宅基地

文章浏览阅读1w次,点赞27次,收藏175次。[PHP]学生成绩管理系统其实,这是我大一的时候,数据库的课程设计,虽然现在回看也觉得代码凌乱,但也懒得改了,之前是发在了自己搭建的博客,现在发到CSDN上来。文章目录[PHP]学生成绩管理系统1 前言2 功能模块2.1学生模块2.2 教师模块2.3 主要的文件结构3 界面设计3.1 登录界面3.2 学生主页(我的成绩)3.3 各科成绩3.4 教师主页(学生管理)3.5 学生信息详情3.6 学生信息修改3.7 添加学生信息3.8 课程管理3.9 各科成绩3.10 一键管理4 数据库设计4.1 E-R图4_php成绩管理系统

基于ssm超市库存商品管理系统的设计与实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读775次,点赞22次,收藏24次。功能对照表的目的是帮助开发团队了解软件的功能状况,及时修复功能缺陷和错误,并提高软件的质量和稳定性。功能编号功能名称功能描述功能状态备注1用户登录用户可以通过提供用户名和密码登录系统正常用户名和密码的验证机制安全性2用户注册用户可以通过提供用户名、密码和电子邮件地址注册新的账户正常无3密码修改用户可以通过提供原密码和新密码修改已有账户的密码正常用户密码的修改操作是否需要提供安全认证4用户信息查看用户可以查看自己的个人信息,如用户名、电子邮件地址、角色等正常无。

阿里云PAI大模型RAG对话系统最佳实践_rag最佳实践-程序员宅基地

文章浏览阅读745次,点赞12次,收藏21次。通过以上更具体的步骤和考虑因素,_rag最佳实践

python如何另存文件_python如何保存文本文件-程序员宅基地

文章浏览阅读3.1k次。python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,使用close()函数就可以关闭并保存文本文件了示例代码如下:执行结果如下:内容扩展:Python3将数据保存为txt文件的方法,具体内容如下所示:f = open("data/model_Weight.txt",'a') #若文件不存在,系统自动创建。'a'..._怎么保存python文件

随便推点

vue中的js文件如何使用i18n 国际化_vue中i18n.js文件中如何调用解决,并将结果赋值给i1 8n的message-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏6次。1.在main.js文件中引入:方式1://main.jsimport VueI18n from 'vue-i18n'Vue.use(VueI18n) // 通过插件的形式挂载,通过全局方法 Vue.use() 使用插件const i18n = new VueI18n({ locale: 'zh', // 语言标识 //this.$i18n.locale // 通过切换loca..._vue中i18n.js文件中如何调用解决,并将结果赋值给i1 8n的message

linux驱动开发:ft5x06的touch screen的IIC驱动程序编写_触摸屏a类协议和b类协议-程序员宅基地

文章浏览阅读2.8k次。触摸屏属于一个标注的input dev.所以我们按照输入子系统的流程来实现驱动开发。 实际板子与CTPM的通讯连接基于IIC总线,所以我们需要把驱动挂载到IIC总线下面去,也就是注册IIC驱动到iic_core.c中去。 实例化一个IIC设备有多种方式,仿照上一次的24cxx IIC设备的创建,我们来实现ft5x06IIC设备的创建。 因实际板子上TS IC使用的是ft5x02,所以先实例化设_触摸屏a类协议和b类协议

关于html中下拉菜单select的样式的改变_html设置select选择显示和下来显示怎么能不一致-程序员宅基地

文章浏览阅读5.2k次。关于html中下拉菜单select的样式的改变作者:菩提树下的杨过 日期:2006-06-12字体大小: 小 中 大 首先要告诉大家,如果你是用css的方法,除了箭头部分,其他都可以改变,这是很令人别扭的事,因为其他的样式改了,箭头部分改不了等于无用。下面举个css改select的例子 HTML代码 .box{border:1px solid#C0C0_html设置select选择显示和下来显示怎么能不一致

ZedBoard-自定义IP核实现+PS成功调用【详细步骤+流程介绍+源码】_zedboard教程-程序员宅基地

文章浏览阅读3.4k次。软件环境:WIN7_64 + ISE 14.4 (system_edition)硬件:Zedboard、USB-Cable线搭建图: 经过前几天的学习,查看数据手册、官方例程,笔者已经对Zedboard有了基本的了解,但是怎样才能充分发挥ZYNQ的优势呢?这个就不得不说下ZYNQ的基本架构了,它分为PS(Processing System)和PL(Progr_zedboard教程

使用H2O机器学习"十分钟"提交天池练习赛--工业蒸汽量预测,超过86%的队伍_练习赛-蒸汽数据集-程序员宅基地

文章浏览阅读430次。试用一下H2O全自动机器学习下载数据集天池练习赛"工业蒸汽量预测",下个数据集:https://tianchi.aliyun.com/competition/entrance/231693/introduction安装H2OH2O requirements:pip install requestspip install tabulatepip install ..._练习赛-蒸汽数据集

VxLAN-分布式网关_vxlan分布式网关实验-程序员宅基地

文章浏览阅读603次。vLSW1、vLSW2充当虚拟交换机,给数据添加vlan tag。由于模拟器PC不会主动发送ARP,需要用PC ping 网关地址。查看VPN实例中的路由,学习到32位主机路由。查看OSPF邻居是否建立,路由是否学习到。CE1上学习到32位主机路由(回城路由)查看BGP EVPN学习的5类路由。测试PC访问外部网络Server。查看BGP EVPN邻居关系。同子网,PC1 访问PC2。跨子网,PC1 访问PC3。查看EVPN的3类路由。查看EVPN的2类路由。查看3层VxLan隧道。查看VPN实例内路由。_vxlan分布式网关实验

推荐文章

热门文章

相关标签