Skip to content

Core 核心能力

介绍

core/ 是 AndroidProject-Compose 的基础能力层。它和 feature/ 一起编译在唯一的 :app Gradle 模块中,通过包路径区分职责,而不是通过 Gradle 依赖形成编译隔离。

如果把一个页面看成“展示状态并响应操作”,Core 就负责提供页面需要的状态基类、数据访问入口、主题、通用组件和导航运行时。Feature 只负责把这些能力组合成具体业务页面。

设计目标

  • 统一入口:网络、Room 和本地存储都通过 Repository 进入 Feature,页面不直接创建 Service、DAO 或存储实例。
  • 统一状态:单对象请求和分页列表分别使用对应网络基类,页面不重复实现 Loading、Error 和重试逻辑。
  • 统一视觉:颜色、字体、圆角、间距和基础布局由 Design System 提供,避免页面散落魔法数。
  • 统一导航:路由、回退栈、登录拦截和结果回传由 core/navigation 管理。
  • 明确示例边界core/state 同时包含用户状态和 Demo 计数状态,core/model 也包含项目示例业务模型;示例模型不代表所有业务都必须采用相同结构。

模块组成

目录负责什么初学者先看什么
base/BaseViewModel、网络请求基类和 UI 状态ViewModel 基类
annotation/项目级通用注解;当前已实现 Compose 预览注解注解
designsystem/颜色、Typography、圆角、尺寸和布局封装设计系统主题系统
ui/Scaffold、AppBar、网络容器、空态、加载态和窗口断点UI 组件屏幕适配
model/网络响应、分页、请求、实体和通用 ID 模型数据模型
result/Flow 结果转换、业务成功码和错误回调请求结果处理
network/Retrofit Service、DataSource、拦截器和依赖注入网络请求
data/Repository 与可复用的设计期预览数据数据层
database/Room Database、DAO 和数据库 DataSourceRoom 数据库
datastore/util/storage/本地存储接口与实现;当前底层使用 MMKV本地存储
state/UserStateDemoCounterState 等应用级状态全局状态
navigation/NavKey、Graph 宿主、导航器、拦截和结果导航概览
util/Toast、权限、包信息和时间计算工具类

core/extension/ 是按需创建的 Kotlin 扩展目录。只有扩展函数跨多个 Feature 复用、命名稳定且不依赖具体页面时才放入该目录;单个 Feature 私有的扩展函数保留在对应业务域。

一条完整的数据链路

以网络列表为例,代码不会从 Compose 直接跳到 Retrofit,而是沿着下面的方向流动:

text
NetworkListDemoRoute
    ↓ 收集 StateFlow、转发刷新/重试事件
BaseNetWorkListViewModel<Goods>
    ↓ requestListData()
GoodsRepository
    ↓ getGoodsPage()
GoodsNetworkDataSource → GoodsService → Retrofit
    ↓ NetworkResponse<NetworkPageData<Goods>>
BaseNetWorkListViewModel 合并列表与分页状态

BaseNetWorkListView → RefreshLayout → Compose 列表

这条链路里的每一层都有独立职责:Route 连接状态,ViewModel 管理请求和状态,Repository 选择数据源,DataSource 隔离实现,UI 组件负责展示状态。修改其中一层时,先回到对应章节确认它的边界。

推荐阅读顺序

第一次阅读建议按下面顺序进行,不要直接跳到页面模板:

  1. 设计系统主题系统:先知道页面的颜色、文字、间距和基础布局从哪里来。
  2. UI 组件:了解 AppScaffold、网络容器、空态和刷新组件。
  3. 注解屏幕适配:了解项目级注解边界,并学习当前已有的主题、多设备预览和窗口断点。
  4. ViewModel 基类:理解页面状态由谁持有。
  5. 数据模型请求结果处理:理解网络返回值如何变成页面状态。
  6. 网络请求数据层:理解请求从 Service 到 ViewModel 的完整路径,并按需组织复用预览数据。
  7. Room 数据库本地存储全局状态:学习本地数据和应用级状态。
  8. 非分页网络基类分页列表:把基础能力组合到页面。
  9. 最后阅读NavigationFeature,创建自己的业务页面。

Core 收录边界

一项能力只有在跨多个 Feature 复用、职责稳定且不依赖具体业务页面时,才属于 Core。只服务单个业务域的组件、状态和模型应留在对应 Feature;需要进入 Core 的能力还必须遵守现有依赖方向,不能让通用目录反向引用具体页面。

具体能力的接入和扩展方式由对应章节说明,例如主题令牌放在主题系统,公共组件放在 UI 组件,运行时数据入口和复用预览数据放在数据层,项目级通用注解放在注解

单模块边界

core/ 不是独立 Gradle 模块。当前编译器不会阻止 Feature 直接调用 Core 内部实现,因此“页面只能经过 Repository、Content 不获取 ViewModel”等规则需要通过目录约定和代码审查维护。

相关链接