Jetpack Compose(3) —— 状态管理 - SharpCJ

Jetpack Compose(3) —— 状态管理 - SharpCJ

💡 原文中文,约12800字,阅读约需31分钟。
📝

内容提要

本文讲解了Compose中的状态概念,UI组件为函数,状态通过参数传递,只有状态变化时UI才更新。通过计数器示例,展示了如何使用MutableState和remember管理状态,避免重组时状态重置。提到ViewModel提高复用性,使用rememberSaveable可在配置更改时保持状态。强调设计无状态组件以增强复用性和可测试性。

🔎

延伸解读

为什么直接修改局部变量无法更新 UI

文章通过计数器示例揭示:在 Composable 函数中直接声明 var counter = 0,点击按钮修改后 UI 不变。原因是 Compose 只响应可观察状态的变化,普通变量改变不会触发重组;即使重组发生,局部变量也会被重新初始化为默认值。这提醒开发者,Compose 中的状态必须用 MutableState 等可观察类型包装,否则 UI 不会自动刷新。

remember 与 rememberSaveable 的取舍

remember 能缓存状态,避免重组时重新初始化,但无法在 Activity 销毁重建(如旋转屏幕)时保留数据。rememberSaveable 则能跨配置变更保存状态,但性能开销更大。文章指出,并非所有场景都该用 rememberSaveable 替换 remember,应根据状态是否需要跨配置变更保留来选择,简单 UI 状态用 remember 即可。

状态上提与无状态组件的价值

文章强调将 stateful 组件改造为 stateless 组件,即把内部状态移除,通过参数传入,事件以回调传出。这样做使组件成为纯函数,参数不变则不参与重组,同时降低与业务的耦合,提升复用性和可测试性。状态上提还有助于打造单一数据源模型,是 Compose 状态管理的重要实践。

状态管理方式的适用场景

文章区分了不同状态管理方式:简单且与业务无关的 UI 状态适合在 Composable 内部用 remember 管理;业务逻辑相关的状态可封装到 StateHolder;ViewModel 则适合管理全局或非 UI 的业务状态,并能在配置变更时保留数据。这些方式可以结合使用,在 MVVM 架构中,新项目可直接用 State 类型,传统项目可将 LiveData、Flow 等转换为 Compose 的 State。

❓

Q&A

Compose 中的状态是如何管理的?

Compose 中的状态通过参数传递,只有状态变化时 UI 才会更新。使用 MutableState 和 remember 管理状态,避免重组时状态重置。

什么是无状态组件,它有什么优势?

无状态组件不依赖外部状态,仅依赖传入的参数,具有更好的复用性和可测试性。

如何在 Compose 中保持状态在配置更改时不丢失?

可以使用 rememberSaveable 方法来保持状态在配置更改时不丢失。

ViewModel 在 Compose 中的作用是什么?

ViewModel 用于管理状态,提高复用性,并可以在配置更改时保持状态。

为什么使用 remember 函数?

remember 函数用于缓存变量值,避免在重组过程中重新初始化,从而保持状态。

如何将状态上提以减少组件耦合?

通过将内部状态移除,以参数形式传入,并将需要回调的事件也以参数形式传入,从而实现状态上提。

🏷️

标签

➡️

继续阅读