Skip to content

Feature 模块概览

介绍

Feature 层承载应用业务页面,并把页面注册、Compose UI、ViewModel 与业务展示数据组织在同一个功能域内。路由类型本身位于 core/navigation,Feature 只在自己的 Graph 中把路由映射到页面。当前项目只有一个 Gradle 模块 :appfeature/ 是包级分层,不是可单独编译的 Gradle 子模块。Feature 可以调用 core/ 的通用能力,但不应绕过 Repository 直接访问网络、数据库或本地存储实现。

本组文档假定读者已经完成 CoreNavigation 的阅读。Feature 不重新定义三态、分页或回退栈,而是把这些能力组合成一个可进入、可验证的业务页面。

模块组成

当前源码包含四个功能域:

功能域目录已注册页面主要职责
authfeature/auth/AuthRoutes.Login登录与退出登录示例
demofeature/demo/NetworkDemoNetworkListDemoDatabaseLocalStorageStateManagementNetworkRequestNavigationWithArgsNavigationResultScreenAdaptDemo网络、分页、数据库、本地存储、状态和导航示例
mainfeature/main/MainRoutes.Main 与其内部页面入口应用首页与底部导航,聚合 Core、Navigation、Expand、About 页面
userfeature/user/UserRoutes.Info用户信息与登录态操作

每个功能域按需创建 navigation/view/viewmodel/component/component/data/model/skeleton/ 不是所有功能域都必须具备;当前 demo 使用了 component/skeleton/main 还包含 data/model/

页面运行链路

页面的主链路是:

text
Route → Screen → Content
  │       │              │
  │       │              └─ 只接收参数并绘制 UI
  │       └─ 组合页面骨架、状态分支与回调
  └─ 注入 ViewModel,收集 StateFlow,转发事件

每个页面都保留三层。Route 只收集状态并绑定 ViewModel 事件;Screen 按页面需要组织 Scaffold、页面骨架和 Loading、Empty、Error 等状态容器;Content 只绘制普通页面或成功状态下的最终业务内容。MainScreen 是无 Scaffold 的顶级页面容器,但仍保留 MainContent

页面完成的最小闭环是:

text
Route 已注册 → ViewModel 能被 Hilt 创建 → Screen 能渲染预览
→ 用户事件能到达 ViewModel → Repository / Navigation 调用可验证

与 Core 的关系

  • 路由类型放在 core/navigation/<domain>/*Routes.kt,Feature 的 navigation/*Graph.kt 只负责把路由注册到 EntryProviderScope<NavKey>
  • ViewModel 通过 Hilt 注入 RepositoryUserState 或其他状态持有者;网络、数据库和本地 Store 访问分别由 core/network/datasource/core/database/datasource/core/datastore/datasource/core/data/repository/ 封装。当前本地 Store 的底层实现为 MMKV。
  • View 复用 core/ui/core/designsystem/ 的组件、主题和状态容器。
  • 业务页面跳转由 ViewModel 调用模块 Navigator,结果回传由 ViewModel 使用 core.navigation 提供的结果 API。页面顶部栏的普通返回操作由 Screen 直接调用 navigateBack();其他业务导航不在 UI 中执行。

推荐阅读顺序

  1. 先阅读目录与命名规范,确认文件放置位置。
  2. 根据页面复杂度选择View 规范中的 Route、Screen、Content 拆分方式。
  3. 使用ViewModel 规范组织 StateFlow、Repository 和副作用。
  4. 创建页面流程完成 Route、ViewModel、View、Graph 与模块 Navigator 的接入。
  5. 需要复制代码时参考页面模板,并将占位类型替换为真实模型。

阅读模板前,先确认页面属于单对象请求、分页列表、本地存储还是纯本地状态;基类选择错误会让后续状态和 UI 结构全部偏离。

相关链接