UI 组件
app/src/main/java/com/joker/kit/core/ui 承载了项目级的业务 UI 基础库:所有可复用的 Compose 组件(空态、加载态、标题、文本样式等)都应在此处沉淀,再供 Feature 层引用。与 core/designsystem 的职责不同:designsystem 只对官方 Material 组件做尺寸/颜色的适配,而 core/ui 则可以根据业务特征封装完整组件。
目录结构
| 目录/文件 | 说明 |
|---|---|
component/empty/* | 空数据、无网络、错误等占位组件,默认配合 BaseNetWorkView 使用。 |
component/loading/* | 页面加载、局部加载、加载更多进度等动画。 |
component/network/* | 不分页 (BaseNetWorkView) 与分页 (BaseNetWorkListView) 三态容器。 |
component/refresh/* | RefreshLayout、RefreshHeader、RefreshState,用于实现下拉刷新/上拉加载。 |
component/text/Text.kt | 预设的文本样式封装,如 PrimaryLabel、HintText。 |
component/title/TitleWithLine.kt | 标题组件示例,内置分割线。 |
component/divider/Divider.kt | 统一的分割线封装,配合 designsystem 的尺寸/颜色。 |
如果需要新增自定义按钮、卡片、导航栏等,请在
component下新建子目录,让所有业务页面共享。
现有组件速览
空/加载/错误状态
EmptyData、EmptyNetwork、EmptyError:根据不同场景展示文案、插画和操作按钮。PageLoading、LoadMoreLoading:统一的骨架/进度动画,避免每个页面重复实现。- 推荐与
BaseNetWorkView/BaseNetWorkListView组合,以保持 Loading/Success/Error 行为一致。
网络容器
BaseNetWorkView:封装“未分页的三态 UI”。接收BaseNetWorkUiState<T>与contentlambda,默认提供加载/错误页面,支持自定义动画。BaseNetWorkListView:在三态基础上增加分页、上拉加载、空列表占位等能力,内部已经接好LoadMoreState、RefreshLayout。
刷新体系
RefreshLayout:将rememberPullRefreshState、动画头、内容 Slot 等统一到一个容器中。RefreshHeader/RefreshState:定义下拉刷新时的不同阶段(Idle、Pulling、Refreshing 等),可按需替换头部。- 示例可参考
context/template中的分页模板以及GoodsCommentScreen。
文字与标题
Text.kt中提供了常见的文字样式封装(如列表项副标题、提示文本等),避免在业务代码里直接堆TextStyle。TitleWithLine:常用于设置页、详情页中分组标题,下方自动绘制分割线。
如何新增业务组件
- 确定分类:若是新的空态/加载态,放入
component/empty或component/loading;若是全新类型,可新建目录(如component/banner)。 - 封装 API:参考现有组件的写法,导出
@Composable函数,并对参数提供默认值。必要时在文件头用 KDoc 写明用途。 - 引用 designsystem:尺寸、颜色、间距尽量从
core/designsystem/theme中读取,确保整体一致。 - 示例与文档:如果组件较复杂,请在
docs/help/core/ui.md中追加简短说明或用法片段,方便其他人查阅。
通过在 core/ui 中集中管理可复用的业务组件,团队成员在实现新页面时可以直接挑选现有积木(骨架、空态、标题、刷新容器等),而无需在 designsystem 或 Feature 层重复造轮子。需要扩展时只需在此目录补齐,便能在全局范围复用。