从根本上说,状态生成是将变化逐步应用于界面状态的过程。状态始终存在,并且会随着事件而发生变化。下表总结了事件和状态之间的差异:
活动 |
状态 |
暂时性、不可预测,且存在时间有限。 |
始终存在。 |
状态生成的输入。 |
状态生成的输出。 |
界面或其他来源的生成对象。 |
供界面使用。 |
事件可能来自以下来源:
- 用户:当用户与应用界面进行互动时。
- 状态变化的其他来源:呈现来自界面层、网域层或数据层的应用数据(示例分别为信息条超时事件、用例或仓库)的 API。
状态生成 API
状态生成过程主要用到两个 API,具体取决于您处于流水线的哪个阶段:
销售漏斗阶段 |
API |
输入 |
您应使用异步 API 在界面线程外执行工作,以保证界面不会卡顿。例如 Kotlin 中的协程或 Flow,以及 Java 编程语言中的 RxJava 或回调。 |
输出 |
当状态发生变化时,您应使用可观测的数据容器 API 使界面失效并重新渲染。例如 StateFlow 或 LiveData。可观测数据容器可保证界面始终具有要在屏幕上显示的界面状态 |
在这两者中,与对用于输出的可观测 API 的选择相比,对用于输入的异步 API 的选择对于状态生成流水线的性质具有更大的影响。这是因为输入决定了可能应用于流水线的处理的类型。
状态生成流水线组建
后续部分将介绍各种输入最适合采用的状态生成技术,以及匹配的输出 API。每个状态生成流水线都是输入和输出的组合,并应满足以下条件:
- 可感知生命周期:如果界面不可见或未处于活动状态,除非明确要求,否则状态生成流水线不应消耗任何资源。
- 易于使用:界面应能够轻松呈现生成的界面状态。状态生成流水线输出的相关注意事项因不同的 View API(例如 View 系统或 Jetpack Compose)而异。
状态生成流水线中的输出类型
界面状态的输出 API 的选择及其呈现方式的性质在很大程度上取决于应用用于呈现界面的 API。在 Android 应用中,您可以选择使用 View 或 Jetpack Compose。此时,请注意以下事项:
- 以生命周期感知方式读取状态。
- 状态是否应该在状态持有者的一个或多个字段中公开。
下表总结了在使用 Views 框架时,应该在状态生成流水线中使用哪些 API:
输入 |
输出 |
一次性 API |
|
流 API |
|
一次性 API 和流 API |
|