type
status
date
slug
summary
tags
category
password
icon
😀
接上文

集成

View 中集成 Compose

使用 ComposeView:一个 Android 视图,可以使用其 setContent 方法托管Compose UI 内容

Compose 中使用 View

Compose 暂不支持 Spanned 类,也不显示 HTML 格式的文本,因此我们需要在 Compose 代码中使用 View 系统中的 TextView 来绕过此限制

ValueModels & LiveData

使用 LiveData.liveDataAsState()

将 XML 主题迁移到 Compose

Material2 的使用在上面👆的官方文档中有介绍,这里指做 Material3 的案例
 

Compose 中使用 Navigation

集成导航

参数传递

深度链接

除了参数之外,还可以使用深层链接将应用程序中的目的地公开给第三方应用程序。
  • 将深层链接添加到 AndroidManifest.xml,需要为 RallyActivity 操作 View 和类别 BROWSABLE 以及 DEFAULT
  • 使用 data 标记,添加 scheme,host,pathPrefix
  • 将 rally://accounts/{name} 用作深层链接 URL ,不需要在 AndroidManifest 中声明 “name” 参数,它将被 Navigation 解析为参数
  • adb shell am start -d "rally://accounts/Checking" -a android.intent.action.VIEW
 

附带效应

🗯️
纯函数 纯函数指的是函数与外界交换数据只能通过函数参数函数返回值来进行,纯函数的运行不会对外界环境产生任何影响
附带效应 “副作用”(side effect),指的是如果一个操作,函数或表达式在其内部与外界进行了互动,产生了运算意以外的其他结果,则该操作,函数或表达式具有副作用。
 

组合函数的特点

  • 执行顺序不定
  • 可以合并运行
  • 可能会非常频繁地运行
虽然我们不希望函数执行中出现副作用,但现实情况是有一些逻辑只能作为副作用来处理。例如一些 IO 操作,计时,日志埋点等。这些都是会对外界或收到外界影响的逻辑,不能无限制的反复执行,所以 Compose 需要能够合理地处理一些副作用:
  • 副作用的执行时机是明确的,例如在 Recomposition 时等。
  • 副作用的执行次数是可控的,不应该随着函数反复执行。
  • 副作用不会造成泄露,例如在注册要提供适当时机取消注册。
🗯️
可组合函数本职工作是声明 UI,所有与本质工作无关的,都是副作用(或称为附带效应)

组合函数的副作用

在 Compose 中,可组合函数内部理应只做视图相关的事情,而不应该做函数返回之外的事情,如访问文件等,如果有,那这就叫做附带效应,以下操作全部都是危险的附带效应:
  • 写入共享对象的属性
  • 更新 ViewModel 中可观察项
  • 更新共享偏好设置。
可组合函数应该是无副作用的,如果需要在可组合函数中产生附带效应(例如改变 APP 的状态),需要使用 EffectAPI,以可预测的方式执行那些副作用,一个 effect,就是一个可组合函数,这个可组合函数不生成 UI,而是在组合完成时产生副作用。

组合函数的生命周期

可组合项的生命周期比 activity 和 fragment 的生命周期更简单,一般是进入组合、执行 0次或多次重组、退出组合。
  • Enter:挂载到树上,首次显示
  • Composition:重组刷新 UI
  • Leave:从树上移除,不再显示。
notion image
组合函数中没有自带的生命周期函数,想要监听其生命周期,需要使用Effect(附带效应)API:
💡
这一点类似前端框架中 Hook 的概念,钩子函数

LauncherEffect:第一次调用 Compose 函数时调用

如果在可组合函数中进行耗时操作,就需要将耗时操作放入协程中执行,而协程需要在协程作用域中创建,因此 Compose 提供了 LaunchedEffect 用于创建协程。
  • 当 LaunchedEffect 进入组件树时,会启动一个协程,并将 block 放入该协程中执行。
  • 当组合函数从视图树上 detach 时,协程还未被执行完毕,该协程也会被取消执行
  • 当 LaunchedEffect 在重组时其 Key 不变,那 LaunchedEffect 不会被重新启动执行 block
  • 当 LaunchedEffect 在重组时其 Key 发生了变化,则 LaunchedEffect 会执行 cancel 后,再重新启动一个新协程执行 block

rememberCoroutineScope

由于 LaunchedEffect 是可组合函数,因此只能在其他可组合函数中使用,想要在可组合项外启动协程,且需要对这个协程存在作用域现值,以便协程在退出组合后自动取消,可以使用 rememberCoroutineScope。此外如果需要手动控制一个或多个协程的生命周期,请使用 rememberCorountineScope。

rememberUpdatedState

如果 Key 值有更新,那么 LaunchedEffect 在重组时就会被重新启动,但是有时候需要在LaunchedEffect 中使用最新的参数值,但是又不想重新启动 LaunchedEffect,此时就需要使用 rememberUpdatedState。
rememberUpdatedState 的作用是给某个参数创建一个引用,来跟踪这些参数,并保证其值被使用时是最新值,参数被改变时不重启 Effect。

DisposableEffect:内部有一个 onDispose() 函数函数,当页面退出时调用。

DisposableEffect 也是一个可组合函数,当 DisposableEffect 在其 Key 值变化或者组合函数离开组件树时,会取消之前启动的协程,并会在取消协程前调用其回收方法进行资源回收相关操作,可以对一些资源进行清理。

SideEffect:compose 函数每次执行都会调用该方法。

SideEffect 是简化版的 DisposableEffect,SideEffect 并未接收任何 Key 值,所以每次重组,就会执行其 block,当不需要 onDispose、不需要参数控制时使用 SideEffect。
SideEffect 主要用来与非 Compose 管理的对象共享 Compose 状态
SideEffect 在组合函数被创建并载入视图树后才会被调用

produceState

produceState 可以将非 Compose(如 Flow、LiveData 或 Rxjava)状态转换为 Compose 状态,它接受一个 lambda 表达式作为函数体,能将这些入参经过一系列操作后生成一个 State 类型变量并返回。
produceState 创建了一个协程,但他也可用于观察非挂起的数据源
当 produceState 进入 Composition 时,获取数据的任务被启动,当其离开 Composition 时,该任务被取消。

derivedStateOf

如果某个状态是从其他状态对象计算或派生得出的,请使用 derivedStateOf,作为条件的状态我们称为条件状态。当任意一个条件状态更新时,结果状态都会重新计算

snapshotFlow

使用 snapshotFlow 可以将 State 对象转换为 Flow。snapshotFlow 会运行传入的 block,并发出从块中读取 State 对象的结果,当在 snapshotFlow 块中读取的 State 对象之一发生变化时,如果新值与之前发出的值不相等,Flow 会向其收集器发出新值。
notion image
 
C语言-基础Compose-进阶
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL