UI 组件

可复用的 Compose 控件、反馈状态、媒体组件和组件图库示例。

可复用 Compose UI 位于 core/ui/components,Component tab 则展示这些控件的 live、数据驱动 catalog。构建新 screen 时,把这个 tab 当作视觉参考。

提供什么

Surface状态实现
Shared controlsIntegratedcore/ui/components/*.kt
Component galleryIntegratedfeature/component/ComponentCatalog.kt 和 nested component graph
Toast overlayIntegratedActivity root 的 ToastController + ToastHost
HapticsIntegratedHaptics singleton,支持 selection、success、warning、error feedback
Remote imagesExampleAppAsyncImage 封装 Coil 3

Component inventory

文件用途
AppButton.ktPrimary、secondary、outline、destructive、ghost、link buttons,多种尺寸
AppTextField.kt带 leading/trailing icons、secure entry、error text 的 labeled inputs
AppCard.ktrows、widgets、settings sections 的 grouped surface cards
AppAsyncImage.ktCoil-backed remote image,带 placeholder/fallback
DetailScaffold.kt带 centered top app bar 和 back action 的 detail pages
OfflineBanner.ktNetworkObserver state 驱动的 slim connectivity banner
OtpInput.kt六格 one-time-code input
PasswordStrengthBar.ktPassword strength meter 和纯函数 passwordStrength() helper
SectionHeader.ktUppercase grouped-section labels
SectionedDocument.ktLegal/guide 风格 document sections
State.ktEmptyStateLoadingStateErrorState placeholders
ThemeToggle.ktSystem/Light/Dark segmented theme picker

Component tab 实现为 feature-local graph:

ComponentGraph
  -> ComponentHome
  -> ComponentDetail(route: ComponentRoute)

ComponentCatalog 把 entries 分组为 Controls、Inputs、Containers、Feedback、Media。当前 detail demos:

RouteDemo
ButtonsButton variants、loading/disabled states
ThemeToggleLive theme segmented control
TextFieldsInputs、icons、password transformation、errors
PasswordStrengthInteractive password meter
OtpInput带 completion callback 的 OTP boxes
CardsGrouped-surface containers
SectionHeadersSettings-style section labels
StatesLoading、empty、error placeholders
OfflineBannerConnectivity banner
ToastInfo/success/error transient messages
AsyncImage通过 Coil 渲染 remote image

部分 gallery titles 和 summaries 当前是 plain Kotlin strings。如果需要本地化 gallery 本身,请把 ComponentEntry.titlesummary 改为 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

  1. 从 route composable 开始,用 hiltViewModel() 获取 ViewModel。
  2. 收集 ViewModel state,并把 plain values/callbacks 传给 stateless screen composable。
  3. pushed detail screens 使用 DetailScaffold
  4. 创建一次性控件前,优先使用 AppTextFieldAppButtonAppCard
  5. State.kt components 渲染 loading、empty、error states。
  6. App screens 使用 MaterialTheme.colorScheme.groupedBackground 和 grouped surfaces。
  7. 通过 ToastController 触发 transient feedback;success/error 已经处理 haptics。

相关页面

On this page