关于 wear-compose-m3
为使用 Wear OS Compose Material3 的 Android 编码 Agent 提供开发指导,覆盖版本兼容、组件迁移和样例查找,并要求同步与构建验证。
主要功能
- 01检查库版本与兼容要求
- 02指导 Material 2 与 Horologist 迁移
- 03按组件查找官方样例
- 04要求 Gradle 同步和构建验证
适用场景
- 01升级 Wear Compose Material3 依赖
- 02将 Horologist 组件迁移到 Material3
- 03为 Wear OS 组件实现查找参考样例
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ android/ skills --skill wear-compose-m3安装后在 Claude Code 中输入/wear-compose-m3确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/android/training/wearables/compose/migrate-to-material3.mdreferences/foundation/AmbientModeSample.kt.mdCurvedWorldSample.kt.mdExpandableSample.kt.mdHierarchicalFocusSample.kt.mdPagerSamples.kt.mdRotarySamples.kt.mdSwipeToDismissBoxSample.kt.mdTransformingLazyColumnSample.kt.mdreferences/material3/AlertDialogSample.kt.mdAnimatedTextSample.kt.mdButtonGroupSample.kt.mdButtonSample.kt.mdCardSample.kt.mdCheckboxButtonSample.kt.mdConfirmationDialogSample.kt.mdCurvedTextSamples.kt.mdDatePickerSample.kt.mdDynamicColorSchemeSample.kt.mdEdgeButtonSample.kt.mdFadingExpandingLabelSample.kt.mdIconButtonSample.kt.mdIconToggleButtonSample.kt.mdLevelIndicatorSample.kt.mdLinearProgressIndicatorSample.kt.mdListHeaderSample.kt.mdOneHandedGestureSamples.kt.mdOpenOnPhoneDialogSample.kt.mdPageIndicatorSample.kt.mdPagerScaffoldSample.kt.md详细介绍
前提条件和兼容性
- 当前使用的 Wear OS Compose 版本: 如需查找已安装的库版本,请直接读取
gradle/libs.versions.toml或build.gradle.kts。不要运行./gradlew dependencies或其他 shell 命令来解析版本。 - Wear OS Compose Material3 版本: 如果有内部工具可用于确定
androidx.wear.compose:compose-material3的最新稳定版本{VERSION},请使用该工具。- 否则,获取官方 Maven 元数据 XML,以确定
{VERSION}(忽略-alpha、-beta或-rc,取最高版本号)。
- 否则,获取官方 Maven 元数据 XML,以确定
- 严格遵守: 如果某个版本标记为稳定版,就必须使用该版本,除非用户另有要求。不要因为编辑器中最初出现“Unresolved reference”错误或网页搜索结果过时而降级。
- Kotlin 和 Compose 编译器: 使用 Kotlin 2.0.0+,并搭配
org.jetbrains.kotlin.plugin.composeGradle 插件。 - 最低 SDK: 确保
minSdk至少为 25。 - 编译 SDK 和 AGP: 确保
compileSdk和 AGP 满足库的 AAR 元数据最低要求(1.6.x需要compileSdk >= 35且AGP >= 8.6.0;1.7.x需要compileSdk >= 37且AGP >= 9.1.0)。
注意事项
- 必须同步并验证: 更新
libs.versions.toml或build.gradle.kts中的版本后,在重构前执行 Gradle 同步(或运行./gradlew assembleDebug),并在重构后运行./gradlew assembleDebug验证构建。 - 禁止猜测(错误处理规则): 成功同步后,如果遇到“Unresolved Reference”或 API 不匹配,不要尝试通过降级库版本来“修复”。
功能和工具
功能 1:迁移、更新和添加功能
从旧版 Wear OS Compose 或 Horologist 迁移、更新现有的 Wear Compose Material3 项目或添加功能时,请遵循以下指南。
- 除非开发者另有说明,否则使用
{VERSION}中的最新稳定版 Wear Compose Material3(优先于迁移指南中的任何具体版本字符串)。 - 从 Material 2.5 或 Horologist 迁移时,请阅读迁移指南,并使用其中的官方组件映射。
- 重构任何组件(例如,
Chip->Button)之前,请检查参数名称、插槽类型和“Expressive”设计令牌。 - 不要使用 Horologist Composables、Compose Layout 或 Compose Material 库;请将 Horologist 组件替换为对应的 Wear Compose M3 组件(
AppScaffold-> M3AppScaffold、ScreenScaffold-> M3ScreenScaffold、ScalingLazyColumn->TransformingLazyColumn、ResponsiveListHeader->ListHeader、PagerScreen->HorizontalPagerScaffold、Chip->Button、Confirmation->ConfirmationDialog)。 - 务必对照功能 3 中的组件指南进行检查。
- 迁移或更新组件时,截图测试可能会失败:内边距和位置的预期默认值已经发生变化。不要试图人为匹配之前的截图,应优先采用 Material3 默认值。
功能 2:组件示例
使用此参考表查找 Wear Compose 组件的规范示例。 使用 Wear Compose 组件时,必须使用表格中的链接示例,以确保了解该组件的正确用法。
重要: 标记为 [alpha]、[beta] 或 [rc] 的符号仅适用于相应的预发布版本,不包含在稳定版 {VERSION} 中。除非项目明确针对该预发布版本,否则不要使用这些符号。
androidx.wear.compose.material3.* 中的 Material 3 组件
androidx.wear.compose.foundation.* 中的基础组件
androidx.wear.compose.navigation3.* 中的 Navigation 3 组件
| 组件 / 符号 | 参考示例 |
|---|---|
rememberSwipeDismissableSceneStrategy | SwipeDismissableSceneStrategySample |
能力 3:组件指南
必需:将此能力作为检查清单,用于核对任何组件的使用方式。除了组件语法之外,它还提供了关于如何在实践中使用各组件的更全面指导。
-
AppScaffold和ScreenScaffold- [ ] 使用
AppScaffold作为外层容器,并以ScreenScaffold作为其子项。 - [ ] 只能使用 一个
AppScaffold,而ScreenScaffold可以使用任意数量。
- [ ] 使用
-
ScalingLazyColumn- 改用TransformingLazyColumn。 -
TransformingLazyColumn- 需要以下导入:import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnDefaults import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState // ... import androidx.wear.compose.material3.lazy.rememberTransformationSpec import androidx.wear.compose.material3.lazy.transformedHeight
规范示例:
val columnState = rememberTransformingLazyColumnState() val transformationSpec = rememberTransformationSpec() ScreenScaffold( scrollState = columnState ) { contentPadding -> TransformingLazyColumn( state = columnState, contentPadding = contentPadding ) { item { ListHeader( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ListHeaderDefaults.minimumTopListContentPadding), transformation = SurfaceTransformation(transformationSpec) ) { Text(text = "Header") } } // ... other items item { Button( modifier = Modifier .fillMaxWidth() .transformedHeight(this, transformationSpec) .minimumVerticalContentPadding(ButtonDefaults.minimumVerticalListContentPadding), transformation = SurfaceTransformation(transformationSpec), onClick = { /* ... */ }, icon = { Icon( imageVector = Icons.Default.Build, contentDescription = "build", ) }, ) { Text( text = "Build", maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } }
- [ ] 使用
TransformingLazyColumn替代ScalingLazyColumn。 - [ ] 必须将
ScreenScaffold中的contentPadding参数传递给TransformingLazyColumn。 - [ ] 使用
minimumVerticalContentPadding修饰符设置所需的顶部和底部内边距。- 该修饰符需要使用默认值,例如
ButtonDefaults、CardDefaults、ListHeaderDefaults中的值。 - 注意:这是一个作用域修饰符,只能在
TransformingLazyColumnItemScope中使用。
- 该修饰符需要使用默认值,例如
- [ ] 确保列表项能够变形并缩放(应用于
TransformingLazyColumn内部的组件,而非列表本身):- [ ] 使用
Modifier.transformedHeight(this, transformationSpec)。 - [ ] 使用
transformation = SurfaceTransformation(transformationSpec)。
- [ ] 使用
- [ ] 如果要配置具有吸附效果的列表,请同时使用
flingBehavior和rotaryScrollableBehavior:
val columnState = rememberTransformingLazyColumnState() ScreenScaffold(scrollState = columnState) { contentPadding -> TransformingLazyColumn( state = columnState, flingBehavior = TransformingLazyColumnDefaults.snapFlingBehavior(columnState), rotaryScrollableBehavior = RotaryScrollableDefaults.snapBehavior(columnState) ) { // ... // ... } }
- [ ] 使用
-
ScreenScaffold- [ ] 使用
!LocalScrollCaptureInProgress.current(androidx.compose.ui.platform)控制scrollIndicator的显示。
- [ ] 使用
-
EdgeButton- [ ] 不要将其用作
TransformingLazyColumn中的最后一项。应改用ScreenScaffold中的对应插槽。 - [ ] 在
TransformingLazyColumn中使用时,添加所需的过滚行为:
val columnState = rememberTransformingLazyColumnState() ScreenScaffold( scrollState = columnState, edgeButton = { EdgeButton( onClick = { /* TODO */ }, modifier = Modifier.scrollable( columnState, orientation = Orientation.Vertical, reverseDirection = true, // Apply overscroll to the EdgeButton for proper scrolling behavior. overscrollEffect = rememberOverscrollEffect(), ) ) { Text("More") } } ) { contentPadding -> TransformingLazyColumn( contentPadding = contentPadding, state = columnState, ) { // ... // ... } }
- [ ] 不要将其用作
-
Column- [ ] 仅当屏幕在任何情况下(包括使用最大系统字体时)都永远不会滚动,才将其用作
ScreenScaffold的直接子项。 - [ ] 其他情况均应改用
TransformingLazyColumn。
- [ ] 仅当屏幕在任何情况下(包括使用最大系统字体时)都永远不会滚动,才将其用作
-
样式
- [ ] 不要对文本大小进行硬编码,应使用
MaterialTheme中的typography。 - [ ] 不要对颜色进行硬编码,应使用
MaterialTheme中的colorScheme。
- [ ] 不要对文本大小进行硬编码,应使用
-
使用组件默认值:
- [ ]
Button等组件都有对应的ButtonDefaults对象。 - [ ] 设置内边距和样式值时,应检查并优先使用组件对应的
*Defaults对象,而不是硬编码值。
- [ ]
-
使用 Wear 专用预览注解 (
androidx.wear.compose.ui.tooling.preview):- [ ]
@WearPreviewDevices - [ ]
@WearPreviewFontScales - [ ] 确保已包含
androidx.wear.compose:compose-ui-tooling依赖项。
- [ ]
-
环境模式
- [ ] 使用
LocalAmbientModeManager(由CompositionLocalProvider和rememberAmbientModeManager()提供),而不是AmbientLifecycleObserver。
- [ ] 使用
-
导航
- [ ] 新增导航时,使用 Navigation3(
androidx.wear.compose:compose-navigation3)。 - [ ] 使用
rememberSwipeDismissableSceneStrategy()/SwipeDismissableSceneStrategy(androidx.wear.compose.navigation3)。
- [ ] 新增导航时,使用 Navigation3(
-
注释
- [ ] 修改任何 Kotlin 文件时,确保现有注释已更新,并准确反映实现中的任何变更。
-
HorizontalPager或VerticalPager- [ ] 按以下顺序使用 Composable 层级:
AppScaffold、HorizontalPagerScaffold、HorizontalPager、AnimatedPage、ScreenScaffold。对于VerticalPager,顺序也相同。
- [ ] 按以下顺序使用 Composable 层级:
评论
支持 Markdown