Feature 模块概览
业务代码全部位于 app/src/main/java/com/joker/kit/feature,每个功能域(auth、main、user 等)拥有独立的 navigation/、viewmodel/、view/、component/ 目录,与 core/* 提供的基础能力进行解耦。Feature 层不提供通用逻辑,而是承载“项目自己实现的业务”,因此文档只约束目录、命名、状态写法,剩余部分由实际业务自行扩展。
目录结构约定
以 feature/user 为例:
| 目录 | 说明 |
|---|---|
navigation/ | 定义当前模块的 NavGraphBuilder 扩展(例如 userInfoScreen)、Graph 聚合方法(userGraph)以及路由常量。 |
viewmodel/ | 存放与页面对应的 ViewModel,继承 BaseViewModel 或网络基类,负责状态与副作用。 |
view/ | Compose 页面实现,通常分为 Route、Screen、Content 几层,并引用 core/ui 的组件。 |
component/ | 可选,用于提取模块内部共享的 UI 片段(如卡片、列表项等)。 |
其他 Feature 可复制这套结构,确保多人协作时目录统一、职责明确。如果某个模块没有共享组件,可以忽略 component/ 目录,保持最小化即可。
与 Core 的关系
Feature 只做“消费端”工作,所有通用逻辑都来自 core/*:
- 导航:通过
BaseViewModel和AppNavigator调用类型安全路由,Graph 则由 Feature 自己注册。详情见“导航”章节。 - 状态与数据:直接注入
GoodsRepository、UserState等core提供的依赖;网络、数据库、DataStore 都在仓库层统一处理。 - UI 规范:引用
core/designsystem的尺寸/颜色,复用core/ui的骨架、空态、刷新容器等。
这种设计使得核心能力只需维护一份,实现 Feature 时可以专注业务流程。
建议的开发流程
- 定义路由:在
navigation/routes/*中声明@Serializable路由对象,新建模块时同步新增 Graph。 - 创建 ViewModel:利用
BaseNetWorkViewModel/BaseNetWorkListViewModel等基类,绑定仓库与 UI 状态。 - 实现 UI:可沿用“Route -> Screen -> Content”的拆分方式(详见“创建页面流程”章节),在
Route层处理导航/刷新,在Screen层组合布局,在Content层拆出可复用组件。 - 联调与文档:页面完成后,在
docs/help/feature/*中补充目录、命名等说明,方便下一位开发者接手。
模板示例会在后续专门的“页面模板”文档中提供,线上部署后即可直接复制使用,无需依赖本地
context/template目录。
相关文档
Feature 章节只负责约束“如何组织业务目录、如何与 Core 协作”。具体业务实现、组件样式、表单逻辑等均由各模块自行扩展。