news 2026/6/15 21:10:04

Android Jetpack Compose - enableEdgeToEdge 函数、MaterialTheme 函数、remember 函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android Jetpack Compose - enableEdgeToEdge 函数、MaterialTheme 函数、remember 函数

enableEdgeToEdge 函数

@JvmName("enable")@JvmOverloadsfunComponentActivity.enableEdgeToEdge(statusBarStyle:SystemBarStyle=SystemBarStyle.auto(Color.TRANSPARENT,Color.TRANSPARENT),navigationBarStyle:SystemBarStyle=SystemBarStyle.auto(DefaultLightScrim,DefaultDarkScrim)){valview=window.decorViewvalstatusBarIsDark=statusBarStyle.detectDarkMode(view.resources)valnavigationBarIsDark=navigationBarStyle.detectDarkMode(view.resources)valimpl=Impl?:if(Build.VERSION.SDK_INT>=29){EdgeToEdgeApi29()}elseif(Build.VERSION.SDK_INT>=26){EdgeToEdgeApi26()}elseif(Build.VERSION.SDK_INT>=23){EdgeToEdgeApi23()}elseif(Build.VERSION.SDK_INT>=21){EdgeToEdgeApi21()}else{EdgeToEdgeBase()}.also{Impl=it}impl.setUp(statusBarStyle,navigationBarStyle,window,view,statusBarIsDark,navigationBarIsDark)}
  • 在调用 enableEdgeToEdge 函数后,系统状态栏和导航栏会变为透明或半透明,使应用内容可以在其后方显示

MaterialTheme 函数

@Suppress("DEPRECATION_ERROR")@ComposablefunMaterialTheme(colorScheme:ColorScheme=MaterialTheme.colorScheme,shapes:Shapes=MaterialTheme.shapes,typography:Typography=MaterialTheme.typography,content:@Composable()->Unit){valrippleIndication=androidx.compose.material.ripple.rememberRipple()valselectionColors=rememberTextSelectionColors(colorScheme)CompositionLocalProvider(LocalColorScheme provides colorScheme,LocalIndication provides rippleIndication,androidx.compose.material.ripple.LocalRippleTheme provides MaterialRippleTheme,LocalShapes provides shapes,LocalTextSelectionColors provides selectionColors,LocalTypography provides typography,){ProvideTextStyle(value=typography.bodyLarge,content=content)}}
参数说明
colorScheme: ColorScheme主题颜色配置
shapes: Shapes主题形状配置
typography: Typography主题排版配置
content: @Composable () -> UnitCompose 函数类型参数,可以把它理解为一块 UI 内容
例如,传入某个页面的 UI 内容,这块 UI 内容就会自动继承当前 MaterialTheme 样式
Unit 表示这个函数没有实际的返回值

remember 函数

1、基本介绍
  • remember 是一个 Composable 函数,用于在 Composable 函数重组时记住一个值
2、演示
  1. 无参数的 remember 函数
varcountbyremember{mutableStateOf(0)}Button(onClick={count++}){Text("Count:$count")}
  1. 带 key 的 remember
varnamebyremember{mutableStateOf("tom")}valcontent=remember(name){"Hello,$name!"}Button(onClick={if(name=="tom"){name="jerry"}elseif(name=="jerry"){name="tom"}},content={Text(content)})
varnamebyremember{mutableStateOf("tom")}varagebyremember{mutableStateOf(18)}valcontent=remember(name,age){"Hello,$name! You are$ageyears old."}Button(onClick={name="jerry"age=20},content={Text(content)})
3、数据类型状态
  1. 基础类型状态
varinputTextbyremember{mutableStateOf("")}Column{TextField(value=inputText,onValueChange={inputText=it},label={Text(text="请输入内容")})Text("你输入的内容:$inputText")}
varisCheckedbyremember{mutableStateOf(false)}Column{Switch(checked=isChecked,onCheckedChange={isChecked=it})Text("开关状态:${if(isChecked)"开启"else"关闭"}")}
  1. 自定义数据类状态,支持存储自定义数据类,修改时必须赋值新的对象,否则 Compose 无法感知状态变化,因为对象引用未改变
dataclassUser(valid:Int,valname:String,valage:Int)
varuserbyremember{mutableStateOf(User(id=1,name="张三",age=20))}Column{Text("用户ID:${user.id}")Text("用户姓名:${user.name}")Text("用户年龄:${user.age}")Button(onClick={user=user.copy(age=user.age+1)}){Text("年龄 + 1")}}
  1. 集合类型状态,支持存储集合类型,修改时必须赋值新的集合对象,否则 Compose 无法感知状态变化,因为对象引用未改变
varfruitListbyremember{mutableStateOf(listOf("苹果","香蕉","橙子"))}Column{fruitList.forEach{fruit->Text(text=fruit)}Button(onClick={fruitList=fruitList+"葡萄"}){Text("添加葡萄")}}

补充学习

1、尾随 Lambda
(1)基本介绍
  • 当一个函数的最后一个参数是函数类型时,并使用 Lambda 表达式作为参数传递时,可以将 Lambda 表达式放在括号外
(2)演示
funsay_hello(name:String,other_operation:()->Unit):Unit{println("你好,$name")other_operation()}say_hello("张三",{println("今天的天气不错")println("比较适合去旅游")})say_hello("李四"){println("今天的天气不错")println("比较适合去旅游")}
# 输出结果 你好,张三 今天的天气不错 比较适合去旅游 你好,李四 今天的天气不错 比较适合去旅游
funtest(operation:()->Unit):Unit{println("测试开始")operation()println("测试结束")}test{println("测试操作...")}
# 输出结果 测试开始 测试操作... 测试结束
funcustom_compute(operation:(Int,Int)->Int):Unit{println("计算开始")valresult=operation(10,20)println("计算结果:$result")}custom_compute{a,b->a+b}
# 输出结果 计算开始 计算结果:30
传递函数类型参数
  1. 使用 Lambda 表达式
funcustom_compute(operation:(Int,Int)->Int):Unit{println("计算开始")valresult=operation(10,20)println("计算结果:$result")}custom_compute{a,b->a+b}
# 输出结果 计算开始 计算结果:30
  1. 使用函数引用
funcustom_compute(operation:(Int,Int)->Int):Unit{println("计算开始")valresult=operation(10,20)println("计算结果:$result")}funcustom_compute_operation(a:Int,b:Int):Int{returna*b}custom_compute(::custom_compute_operation)
# 输出结果 计算开始 计算结果:200
  1. 使用匿名函数
funcustom_compute(operation:(Int,Int)->Int):Unit{println("计算开始")valresult=operation(10,20)println("计算结果:$result")}custom_compute(fun(a:Int,b:Int):Int{returna-b})
# 输出结果 计算开始 计算结果:-10
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 16:40:41

fingerprint采集:语音元数据标记设备唯一标识

Fingerprint采集:为语音数据赋予“设备身份证” 在智能语音系统日益普及的今天,我们早已习惯用一句话唤醒音箱、通过会议录音自动生成纪要、或是让AI助手完成课堂内容转写。但很少有人追问:这段语音究竟来自哪台设备?是谁在使用它…

作者头像 李华
网站建设 2026/6/15 18:52:47

印象笔记剪藏:网页音频内容一键转文字保存

印象笔记剪藏:网页音频内容一键转文字保存 在信息爆炸的时代,我们每天都在浏览大量网页,却常常错过那些藏在播客、讲座或会议录音中的“金句”。这些声音承载着知识,但一旦听过就难以回溯——除非你愿意反复播放几十分钟的音频来定…

作者头像 李华
网站建设 2026/6/15 15:04:07

snapchat滤镜联动:语音关键词触发AR特效变化

Snapchat滤镜联动:语音关键词触发AR特效变化 在一场虚拟直播中,主播只需轻声说出“变身火焰侠”,瞬间周身燃起烈焰特效;观众喊出“展开翅膀”,头像立刻长出一对发光羽翼——这不是科幻电影,而是基于语音驱动…

作者头像 李华
网站建设 2026/6/15 14:23:08

pdf阅读器增强:扫描版书籍语音朗读后反向转录

扫描版书籍语音朗读后反向转录:一种突破OCR局限的PDF数字化新路径 在数字阅读日益普及的今天,我们早已习惯一键复制、全文搜索、跨设备同步的知识获取方式。然而,当面对一本扫描版PDF——尤其是那些字体模糊、排版错乱、甚至带有手写批注的老…

作者头像 李华
网站建设 2026/6/15 14:10:50

kibana可视化:语音控制图表类型切换与钻取

Kibana 可视化:语音控制图表切换与数据钻取的实践探索 在现代企业数据分析场景中,Kibana 作为 Elastic Stack 的核心可视化工具,承载着从日志监控到业务洞察的多重任务。然而,随着仪表板复杂度上升,用户频繁地点击“编…

作者头像 李华
网站建设 2026/6/15 14:11:29

樊登读书会合作:讲书内容结构化便于会员学习

樊登读书会合作:讲书内容结构化便于会员学习 在知识付费浪潮席卷的今天,越来越多用户习惯通过音频“听书”来提升自我。樊登读书会正是这一趋势下的佼佼者——它把一本本厚重书籍浓缩成40分钟的口语化解读,帮助会员高效获取认知增量。但问题也…

作者头像 李华