Compose 学习总结

news2024/12/26 0:20:20

ompose发布正式版已经有一段时间了。趁最近比较闲,抓紧学习一波。

学习过程中,主要以实战项目中常用技术为目标。下面是项目地址,会长期更新,希望能给正在学习Compose的小伙伴一点参考。同时您有什么好的建议,也可以提issue给我,我们一起讨论。

目标

  • 配合Retrofit+Okhttp实现数据加载并展示
  • 实现列表的上拉加载更多、下来刷新
  • 项目采用单页面
  • 使用compose-navigation实现路由导航
  • 使用ViewModel+LiveData实现MVVM架构
  • 使用ViewModel+Flow(LiveData)实现MVI架构
  • 导航动画使用
  • compose中嵌入原生控件
  • 常见的动画使用
  • 全局状态的管理
  • 适配平板
  • 暗黑适配
  • 多主题定制,切换
  • 自定义组件
  • 视频列表实现和优化
  • 嵌入网页,和js交互
  • compose-permission使用
  • compose-pager使用
  • 流式布局实现和优化
  • Material3主题适配
  • 实现至少两个复杂页面并交互
  • 登录功能,并实现全局登录状态的同步
  • 本地数据存储Room、DataStore等组件的使用
  • 自定义页面状态管理组件
  • 代码质量检测工具
  • 老项目混写Compose
  • 其他更高级的功能,想到再补充

知识点

这只是我自己学习过程中的笔记和思考,可能不是完全正确,如有错误,忘指正!

SnackBar的使用

//第一步:
val snackbarHostState = remember { SnackbarHostState() }
//通过kotlin Channel发送消息
val channel = remember { Channel<String>(Channel.CONFLATED) }

//第二步:
LaunchedEffect(key1 = channel) {
    channel.receiveAsFlow().collect {
        snackbarHostState.showSnackbar(it)
    }
}

//第三步:
 Scaffold(
        modifier = Modifier.fillMaxSize(),
        backgroundColor = Color.Transparent,
        scaffoldState = rememberScaffoldState(snackbarHostState = snackbarHostState)
   ) {
}

//第四步:
channel.trySend("需要显示的文本")

和ViewModel配合使用

使用ViewModel扩展函数需要添加下面组件:

implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1"
//示例代码
@Composable
fun HomeMainPage(viewModel: HomeMainViewModel = viewModel()) {}

将LiveData转换成State需要添加下面组件:

implementation "androidx.compose.runtime:runtime-livedata:1.2.1"
//示例代码
val counter = viewModel.counter.observeAsState()

软键盘显示/隐藏的控制

 val keyboard = LocalSoftwareKeyboardController.current
 // ...
 onClick = {
     keyboard?.hide()
     keyboard?.show()
 }

不借助State手动刷新(不推荐这么做)

DisposableEffect

和生命周期相关的逻辑执行使用。比如广播注册和反注册、监听和注销监听等等。

key1传Unit或者true,首次渲染执行一次,重组则不再执行。key1传State,则State值变化,则再次执行。

SideEffect

每次重组都需要执行的副作用。比如日志打印等等。

LaunchedEffect

需要调用协程函数的时候使用。

key1传Unit或者true,首次渲染执行一次,重组则不再执行。key1传State,如果State值变化,则再次执行。

如果是条件启动该副作用,条件应该写在外面,而不是LaunchedEffect里面,尽量减少资源的浪费。

Compose函数中dp转px

import androidx.compose.ui.platform.LocalDensity

val pxValue = with(LocalDensity.current) { 16.dp.toPx() }

// or

val pxValue = LocalDensity.current.run { 16.dp.toPx() }

 设置部分文字不可复制

 // 设置可选区域
 SelectionContainer {
     // Column等价于竖直的LinearLayout
     Column {
         Text(text = "可以选中我,可以选中我,可以选中我")

         // 设置不可选区域
         DisableSelection {
                Text(text = "选不中我,选不中我,选不中")
         }

         // 位于可选区域内,可选
         Text(text = "可以选中我,可以选中我,可以选中我")
     }
 }

物理返回键的处理

使用BackHandler进行拦截,但是不能写在MaterialTheme的代码块中,否则不生效

@Composable
fun TestPage(){
    BackHandler {
        //TODO:拦截物理返回键
    }
    
    MaterialTheme {
        androidx.compose.material.Scaffold {
            Box(Modifier.padding(it)) {
                
            }
        }
    }
}

我的一点看法

我之前用Flutter写过几个demo,逐渐熟悉了写Flutter后,感觉写起来真好。特别是Android Studio各种智能补全,写起来特别流畅。所以一直比较抵触学Compose,总感觉比Flutter书写体验差太多了。不过我毕竟还是一个Android开发嘛,还指望着吃这碗饭,所以Android这边的新技术也要学习起来。

写这篇文章的时候,我前前后后学Compose大概花了一周。主要是remember和Effect都是新概念,从接触到理解个大概,花了一些时间。如果有学习过React前端技术的,应该立马就能明白,可惜我并没有这样的经验。

学习了基本的组件后,我就开始写上面这个项目,刚开始写起来有点生疏。比如状态提升什么的,刚开始写完全没注意到。不过随着业务逐渐偏向于实战项目,不断重构和优化代码,状态提升这个东西,自然而然就有了。

代码写的好不好,性能怎么样。除了直觉感受,更重要的是要有工具来检测,于是又到处搜文章看,然后尝试大佬们推荐的做法。工具有了之后,又把之前性能不好的地方重构了下。

总体来说,目前Compose已经很好了,我个人感觉性能上不比原生差。而且函数组合方式真的比类继承好使多了,非常灵活,而且少很多模板代码。写动画真的不要太爽,原生项目写个动画有多痛苦,相信做过原生开发的小伙伴都知道。另外自定义控件比原生容易多了,原生自定义需要理解很多概念,什么ViewGroup,View,事件传递等等。而Compose相对来说理解的概念就少多了,而且代码更简洁。有时候寥寥几句代码,就能实现很复杂的组件。

希望想在Android领域继续讨饭吃的小伙伴都学起来吧!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嗖的一下!3分钟用ChatGPT生成海南旅游思维导图!

大家好&#xff0c;我是菜鸟哥&#xff01; 五一长假即将来临&#xff0c;很多小伙伴都要准备出去玩了&#xff01;旅游肯定要做攻略啊&#xff0c;比如热门的景点海南三亚&#xff0c;北京&#xff0c;上海&#xff0c;成都这些都是打卡的网红景点&#xff01;小编比较喜欢去海…

IIC协议相关

一.IIC协议初识 IIC(集成电路总线)&#xff0c;半双工同步通信方式 *特点 1.简单性和有效性 由于接口直接在组件之上&#xff0c;因此IIC总线占用的空间特别小&#xff0c;减少了电路板的空间和芯片管脚的数量&#xff0c;降低了互联成本&#xff0c;总线的长度可高达25英尺…

Figma转Sketch的3种免费又快捷的方法!

Figma和Sketch是UI设计师常用的两款软件。Figma属于在线协作设计工具&#xff0c;而Sketch是一款本地应用程序。它们都有许多优点&#xff0c;深受许多设计师的喜爱。然而&#xff0c;在实际工作中&#xff0c;有时需要将这两种文件进行转换&#xff0c;例如将需要在Sketch中使…

AI绘画——Night Sky YOZORA Model 模型 ——“实现终极图像质量和大图像尺寸(>1536 x 1024)”

目录 Night Sky YOZORA Model 模型 ——“实现终极图像质量和大图像尺寸&#xff08;>1536 x 1024&#xff09;”由YozoRaAru培训 如果你需要更好的色彩表现&#xff0c;我推荐你试一下Color Box 省流版介绍&#xff1a;一个字“炫”&#xff0c;tag也是越炫越好 以下是…

javaweb830在线答疑系统dzkfA1A5程序

2&#xff0e;系统用户管理&#xff1a;不管是超级管理员还是普通管理员都需要管理系统用户&#xff0c;包括普通管理员的添加、删除、修改、查询&#xff0c;修改管理员的登录密码&#xff0c;新添加的管理员用户可以登录系统。 3&#xff0e;注册用户管理&#xff1a;游客在前…

多因子优化,多任务优化,多模式优化之间的区别

最近几年在进化计算这个圈子里多任务优化Multitasking很火&#xff0c;其中包含多因子Multifactorial Evolutionary, 多任务 Multitasking Evolutionary, 和多模式进化 Multiform Evolutionary。 今天就来讲讲他们之间的区别。 多因子优化 在“Enhancing Evolutionary Multi…

CCF-CSP真题《202303-1 田地丈量》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202303-1试题名称&#xff1a;田地丈量时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛上散落着 n 块田地。每块田地可视为…

HTTP与HTTPS详解

一、HTTP的概念 HTTP是超文本传输协议&#xff0c;是一种应用层协议&#xff0c;是基于为浏览器/服务器间提供统一的信息交换格式而出现的&#xff0c;其发展历程为HTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3。 在HTTP/3之前&#xff0c;HTTP都是基于TCP传输的。 二、HTTP报文格式 …

设计模式之状态模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、状态模式是什么&#xff1f; 状态模式是一种行为型的软件设计模式&#xff0c;当一个对象的内在状态改变时&#xff0c;其行为…

C++ Linux Web Server 面试基础篇-操作系统(二)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏定期更新Qt的一些项目Demo 项目与…

ClickHouse分区表的正面与侧面

当我们处理连续数据并需要基于移动窗口&#xff08;如&#xff0c;仅使用过去三个月数据&#xff09;计算时使用分区功能非常有用&#xff0c;因为分区无需删除数据&#xff0c;就能高效避过不使用的&#xff08;或过期&#xff09;数据。本文介绍分区表原理&#xff0c;对比查…

一文读懂|数字化到底是什么?

现在大家都在说数字化&#xff0c;数字化到底是什么&#xff1f; 翻阅很多关于数字化的文章&#xff0c;大部分都在混淆术语&#xff0c;部分文章已经开始将数字化标记为数字化转型&#xff0c;以安抚管理层、获得项目批准或进行销售...... 所以这篇内容&#xff0c;我会尽可…

第十四章 动手,高级写法应用让SQL飞

参考《收获&#xff0c;不止SQL优化》作者: 梁敬彬 / 梁敬弘 所谓高级SQL&#xff0c;就是内部被优化过的SQL&#xff0c;可以用简单的语法实现复杂的功能&#xff0c;同时性能上还有提升。比如INSERT ALL、WITH子句、MERGE…… 一、 高级写法思维导图&#xff08;自己整理&am…

java连接webservice

前言 WebService 也叫XML Web Service&#xff0c;WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求&#xff0c;轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务&#xff0c;使用WSDL文件进行说明&#xff0c;并通过UDDI进行注册。 一、…

什么是 IT 基础架构管理

各行各业的企业组织不断面临创新和扩展的压力。就在十多年前&#xff0c;一个企业组织可以争取时间&#xff0c;在投资新技术方面保持保守&#xff0c;同时仍然保持竞争优势。快进到今天&#xff0c;随着业务实践的变化和新技术的不断涌现&#xff0c;商业和技术格局更加动态。…

【C++】文件IO流及stringstream流的使用

文章目录 一、引入二、自定义类型隐式类型转换三、sync_with_stdio同步四、文件IO流4.1 open和close文件4.2 写入文件与读出文件 五、stringstream流的使用5.1 将数值类型数据格式化为字符串5.2 序列化和反序列化 一、引入 int main() {string str;while (cin >> str){c…

适合零基础小白,循序渐进学习--文件操作--相关函数

目录 一. 前言 二. 正文 2. 1什么是文件 &#xff08;1&#xff09;程序文件 &#xff08;2&#xff09;数据文件 2.2文件名 2.3文件类型 2.4 文件缓冲区 2.5 文件指针 2.7 文件操作函数 (1) fopen()--- 打开文件 (2) fclose()--- 关闭文件 2.7 文件的顺序读写&…

ArcGIS制图技巧

目录 1、经纬度网置于底层 2、设置经纬网刻度为英文 3、设置左右经纬度为垂直&#xff0c;不显示分秒&#xff0c;以及改变字体等 4、拖动制图中的图层 5、设置经纬度网为曲线 6、根据经纬度导入样本点 1、经纬度网置于底层 最初我们的网格是下图这个样子&#xff1a; 然…

智慧化工业企业能耗管理系统平台的构建

节能监测技术是节能减排、有效节能的重要支撑技术&#xff0c;当前能源资源日渐枯竭的紧张形势下&#xff0c;节能意识的增强以及各行业对节能技术的需求不断增加&#xff0c;使得节能技术的开发越来越受到人们的重视。工业企业能耗监测系统的构建是按照“统一规划、分期分批”…

头像展示样式

先上效果图 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body {align-items: center;background-color: #f2f2f2;display: flex;font-fa…