Now in Android 不只是一个 Compose 示例,它更像是一份现代 Android 工程样板:UI、数据流、模块化、依赖注入、离线优先和 Gradle 构建组织都能在里面找到参考。
核心结论
- UI 层只消费
UiState,用户操作通过事件向上发送。 - 数据层通过 Repository 屏蔽网络、本地数据库和同步策略。
- 模块化结构让 feature 与 core 边界清晰,避免功能模块互相依赖。
- Hilt 负责对象装配,但架构稳定性来自清晰的接口边界。
build-logic和 Version Catalog 是大型项目保持构建一致性的关键。
响应式架构
Now in Android 的核心心智模型是:
Repository / UseCase
-> Flow
-> ViewModel
-> UiState
-> Compose UI
UI 不主动拉取数据,而是观察状态流。状态变化后,Compose 自动重组对应区域。
值得学习的点:
StateFlow暴露稳定的 UI 状态;combine聚合多个数据源;map把领域模型转换为 UI 模型;- UI 只负责展示状态和发送事件;
- 数据流方向稳定,调试路径清晰。
模块化结构
典型层次:
:app
:feature:*
:core:*
职责划分:
:app负责应用入口、导航容器和全局装配;:feature:*负责具体业务页面;:core:model提供基础模型;:core:data提供 Repository 实现;:core:database、:core:network分别处理本地和网络数据源。
关键原则:
feature 模块不要相互依赖,公共能力下沉到 core。
这样可以避免功能之间形成横向耦合,也更利于并行开发和增量构建。
依赖注入
Hilt 的价值不是“省掉 new 对象”,而是把对象创建和依赖关系集中管理。
重点理解:
@HiltViewModel:让 ViewModel 进入 Hilt 图;@Inject:声明构造函数依赖;@Module:提供无法构造注入的对象;@Binds:把接口绑定到实现;@Provides:手动创建对象;@InstallIn:声明对象所在组件和生命周期。
架构上更重要的是:ViewModel 依赖接口,而不是直接依赖具体数据源。
数据层和离线优先
Repository 是数据层的统一入口。它不只是简单转发网络请求,而是负责协调:
- 本地数据库;
- 网络接口;
- 同步策略;
- 缓存策略;
- 数据模型转换。
离线优先的基本思路:
UI 优先观察本地数据库
-> 后台同步网络数据
-> 写入数据库
-> 数据库变化自动推动 UI 更新
这种结构的优点是:UI 响应快,弱网下仍有可用数据,数据来源也更稳定。
构建组织
Now in Android 里值得重点学习 build-logic 和 libs.versions.toml。
build-logic 解决重复 Gradle 配置:
- Android application/library 公共配置;
- Kotlin 编译配置;
- Compose 配置;
- Hilt 配置;
- 测试配置。
Version Catalog 解决依赖版本集中管理,让多模块项目不用到处硬编码版本号。
回看清单
- 现代 Android 架构重点是稳定数据流和清晰模块边界。
- Compose 只是 UI 表达方式,真正的复杂度在状态和数据层。
- Repository 应该屏蔽数据源细节。
- feature 模块不要互相依赖。
- 构建逻辑也需要架构设计,不能只堆在每个模块脚本里。