UI 组件
可复用的 Compose 控件、反馈状态、媒体组件和组件图库示例。
可复用 Compose UI 位于 core/ui/components,Component tab 则展示这些控件的 live、数据驱动
catalog。构建新 screen 时,把这个 tab 当作视觉参考。
提供什么
| Surface | 状态 | 实现 |
|---|---|---|
| Shared controls | Integrated | core/ui/components/*.kt |
| Component gallery | Integrated | feature/component/ComponentCatalog.kt 和 nested component graph |
| Toast overlay | Integrated | Activity root 的 ToastController + ToastHost |
| Haptics | Integrated | Haptics singleton,支持 selection、success、warning、error feedback |
| Remote images | Example | AppAsyncImage 封装 Coil 3 |
Component inventory
| 文件 | 用途 |
|---|---|
AppButton.kt | Primary、secondary、outline、destructive、ghost、link buttons,多种尺寸 |
AppTextField.kt | 带 leading/trailing icons、secure entry、error text 的 labeled inputs |
AppCard.kt | rows、widgets、settings sections 的 grouped surface cards |
AppAsyncImage.kt | Coil-backed remote image,带 placeholder/fallback |
DetailScaffold.kt | 带 centered top app bar 和 back action 的 detail pages |
OfflineBanner.kt | 由 NetworkObserver state 驱动的 slim connectivity banner |
OtpInput.kt | 六格 one-time-code input |
PasswordStrengthBar.kt | Password strength meter 和纯函数 passwordStrength() helper |
SectionHeader.kt | Uppercase grouped-section labels |
SectionedDocument.kt | Legal/guide 风格 document sections |
State.kt | EmptyState、LoadingState、ErrorState placeholders |
ThemeToggle.kt | System/Light/Dark segmented theme picker |
Component gallery
Component tab 实现为 feature-local graph:
ComponentGraph
-> ComponentHome
-> ComponentDetail(route: ComponentRoute)ComponentCatalog 把 entries 分组为 Controls、Inputs、Containers、Feedback、Media。当前 detail demos:
| Route | Demo |
|---|---|
Buttons | Button variants、loading/disabled states |
ThemeToggle | Live theme segmented control |
TextFields | Inputs、icons、password transformation、errors |
PasswordStrength | Interactive password meter |
OtpInput | 带 completion callback 的 OTP boxes |
Cards | Grouped-surface containers |
SectionHeaders | Settings-style section labels |
States | Loading、empty、error placeholders |
OfflineBanner | Connectivity banner |
Toast | Info/success/error transient messages |
AsyncImage | 通过 Coil 渲染 remote image |
部分 gallery titles 和 summaries 当前是 plain Kotlin strings。如果需要本地化 gallery 本身,请把
ComponentEntry.title 和 summary 改为 string resource ids。
Toasts
ToastController 暴露一个 buffered SharedFlow<ToastEvent> 和 variants:
enum class ToastVariant { Info, Success, Error }MainActivity 在 root AppNavGraph 上方渲染一个 ToastHost,顶部居中,并为 status bars 留出
padding。Success 和 error toasts 会通过 ToastController 自动触发 haptics。
从 ViewModel 或 controller 中使用:
toastController.showSuccess("Saved")
toastController.showError("Could not save")Haptics
Haptics 在 Android 12+ 上解析 VibratorManager.defaultVibrator,旧版本回退到 Vibrator。
设备没有 vibrator 时会 no-op。
可用调用:
| Method | 用途 |
|---|---|
selection() / light() | 小 UI ticks |
medium() / heavy() | 更强的 press feedback |
success() | success waveform |
warning() | warning waveform |
error() | error waveform |
组合新 screen
- 从 route composable 开始,用
hiltViewModel()获取 ViewModel。 - 收集 ViewModel state,并把 plain values/callbacks 传给 stateless screen composable。
- pushed detail screens 使用
DetailScaffold。 - 创建一次性控件前,优先使用
AppTextField、AppButton、AppCard。 - 用
State.ktcomponents 渲染 loading、empty、error states。 - App screens 使用
MaterialTheme.colorScheme.groupedBackground和 grouped surfaces。 - 通过
ToastController触发 transient feedback;success/error 已经处理 haptics。
