目录与命名规范
Feature 层文件全部位于 app/src/main/java/com/joker/kit/feature。每个功能模块(示例:auth、main、user、后续扩展的商品/订单等)都应维持一致的目录层级,以便多人协作时快速定位文件。
基础目录结构
feature/
├── auth/
│ ├── navigation/ # 仅放路由、Graph、NavBuilder 扩展
│ ├── viewmodel/ # 与页面一一对应的 ViewModel
│ ├── view/ # Route/Screen/Content Compose 文件
│ └── component/ # (可选) 模块内复用的 UI 片段
├── main/
│ └── ...
└── user/
└── ...
component/目录可选,仅当模块内有可复用 UI 时才创建,以免产生空目录。
命名约定
包 & 文件
- 包名全部小写,按模块划分:
com.joker.kit.feature.goods.view。 - 页面文件:
${PageName}Screen.kt,内部包含 Route/Screen/Content 三级函数。 - ViewModel:
${PageName}ViewModel.kt,与页面一一对应。 - 导航:
${PageName}Navigation.kt或${ModuleName}Graph.kt,用于组合当前模块的页面。
类 & 函数
- 视图层遵循三层命名:
FooRoute(收集状态)、FooScreen(布局/状态切换)、FooContent(成功态)。 - ViewModel 使用页面名 +
ViewModel,继承BaseViewModel或网络基类,公开StateFlow、回调函数。 - Graph 函数统一写成
fun NavGraphBuilder.goodsGraph(...)/fun NavGraphBuilder.goodsDetailScreen(),便于在AppNavHost中直接调用。
示例:User 模块
feature/user 当前结构如下,可作为基线:
user/
├── navigation/
│ ├── UserGraph.kt
│ └── UserNavigation.kt (提供 userInfoScreen)
├── viewmodel/
│ └── UserInfoViewModel.kt
└── view/
└── UserInfoScreen.kt若新增“地址管理”模块,可仿照上面结构创建 feature/address/...,并在 AppNavHost 中注册 addressGraph。
校验清单
- [ ] 模块目录与
auth/main/user保持一致,不额外嵌套奇怪层级。 - [ ] 文件命名遵循
${PageName}Screen.kt / ${PageName}ViewModel.kt / ${ModuleName}Graph.kt。 - [ ] Graph 只负责注册
composable<Route>(),实际逻辑在 ViewModel & 页面内处理。
遵循上述规范可以让 Feature 模块快速扩展,同时保持与 Core 层的解耦,任何人接手都能立即理解结构。