Compose
可以配合多个Jetpack
组件开发提高开发效率
Compose
中ViewModel
的使用和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
}
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
不是学习Compose
的充要条件
hilt的使用和传统开发基本一致,可以查看我的另一篇文章:https://juejin.cn/post/6967148539277213733
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())
)
})
关注公众号学习更多知识
文章浏览阅读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试帽项目
文章浏览阅读320次,点赞3次,收藏6次。探索T-Writer.js:一款强大的Web文本编辑器项目地址:https://gitcode.com/ChrisCavs/t-writer.jsT-Writer.js 是一个基于JavaScript的开源富文本编辑器,旨在提供一种简洁、高效的在线写作体验。它具备现代Web应用所需的多种功能,并且易于集成到你的网站或应用中。技术分析T-Writer.js 使用了最新的Web技术栈,包括:...
文章浏览阅读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成绩管理系统
文章浏览阅读775次,点赞22次,收藏24次。功能对照表的目的是帮助开发团队了解软件的功能状况,及时修复功能缺陷和错误,并提高软件的质量和稳定性。功能编号功能名称功能描述功能状态备注1用户登录用户可以通过提供用户名和密码登录系统正常用户名和密码的验证机制安全性2用户注册用户可以通过提供用户名、密码和电子邮件地址注册新的账户正常无3密码修改用户可以通过提供原密码和新密码修改已有账户的密码正常用户密码的修改操作是否需要提供安全认证4用户信息查看用户可以查看自己的个人信息,如用户名、电子邮件地址、角色等正常无。
文章浏览阅读745次,点赞12次,收藏21次。通过以上更具体的步骤和考虑因素,_rag最佳实践
文章浏览阅读3.1k次。python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,使用close()函数就可以关闭并保存文本文件了示例代码如下:执行结果如下:内容扩展:Python3将数据保存为txt文件的方法,具体内容如下所示:f = open("data/model_Weight.txt",'a') #若文件不存在,系统自动创建。'a'..._怎么保存python文件
文章浏览阅读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
文章浏览阅读2.8k次。触摸屏属于一个标注的input dev.所以我们按照输入子系统的流程来实现驱动开发。 实际板子与CTPM的通讯连接基于IIC总线,所以我们需要把驱动挂载到IIC总线下面去,也就是注册IIC驱动到iic_core.c中去。 实例化一个IIC设备有多种方式,仿照上一次的24cxx IIC设备的创建,我们来实现ft5x06IIC设备的创建。 因实际板子上TS IC使用的是ft5x02,所以先实例化设_触摸屏a类协议和b类协议
文章浏览阅读5.2k次。关于html中下拉菜单select的样式的改变作者:菩提树下的杨过 日期:2006-06-12字体大小: 小 中 大 首先要告诉大家,如果你是用css的方法,除了箭头部分,其他都可以改变,这是很令人别扭的事,因为其他的样式改了,箭头部分改不了等于无用。下面举个css改select的例子 HTML代码 .box{border:1px solid#C0C0_html设置select选择显示和下来显示怎么能不一致
文章浏览阅读3.4k次。软件环境:WIN7_64 + ISE 14.4 (system_edition)硬件:Zedboard、USB-Cable线搭建图: 经过前几天的学习,查看数据手册、官方例程,笔者已经对Zedboard有了基本的了解,但是怎样才能充分发挥ZYNQ的优势呢?这个就不得不说下ZYNQ的基本架构了,它分为PS(Processing System)和PL(Progr_zedboard教程
文章浏览阅读430次。试用一下H2O全自动机器学习下载数据集天池练习赛"工业蒸汽量预测",下个数据集:https://tianchi.aliyun.com/competition/entrance/231693/introduction安装H2OH2O requirements:pip install requestspip install tabulatepip install ..._练习赛-蒸汽数据集
文章浏览阅读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分布式网关实验