Styles

android/skills/jetpack-compose/theming/styles

作者 android42dc2270e960Complete terms in LICENSE.txt7.7K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库13天前更新

Use this skill to integrate the Jetpack Compose Styles API into an Android project. This skill guides you through upgrading dependencies, setting up component themes, making custom components styleable, and migrating existing layout properties to use unified styles. Migrate custom design system components, replace hard coded parameters with Style attributes, and use Modifier.styleable for interaction states.

AI 生成的概览

指导将 Android Jetpack Compose 自定义组件与主题迁移到实验性 Styles API。

功能
该技能引导智能体在 Android 项目中采用 Jetpack Compose Styles API:升级依赖、开启实验性编译器选项、在 ComponentStyles 文件中定义组件样式,并将自定义可组合函数从零散的样式参数改为 Style 参数配合 Modifier.styleable。它还说明如何把样式接入自定义主题,并通过截图测试和 Compose 预览验证迁移结果。产出的是迁移指导与代码改动,而非独立成品文件。
适用场景
适用于已使用 Jetpack Compose 的 Android 项目,希望把自定义设计系统组件或自定义主题迁移到 Styles API 的场景。不适用于 Material Design 组件样式,也不适用于尚未引入 Compose 依赖的项目。
运行要求
需要 Android 项目使用 compileSdk 37 或更高版本,并依赖 androidx.compose.foundation:foundation 1.12.0-alpha01 或更高版本(或 Compose BOM 2026.04.01 或更高版本),同时在 build.gradle.kts 中选择启用 ExperimentalFoundationStyleApi。视觉验证可选配模拟器或截图测试框架。不包含脚本,仅为说明文档与参考文档。

Limitations

  • Warn the user that this skill is EXPERIMENTAL and requires updating to alpha version of Compose and opting in to the Experimental APIs.
  • This skill only supports custom UI components and custom themes.
  • This skill does not support Material Design component Styles.

Prerequisites

1. Upgrade dependencies

  • The project must use compileSdk version 37 or higher.
  • The project must use androidx.compose.foundation:foundation version 1.12.0-alpha01 or higher.
  • Alternatively, the project must use Compose BOM version 2026.04.01 or higher.
  • The API requires this exact package: import androidx.compose.foundation.style.Style

2. Configure compiler options to enable experimental API

You must opt-in to the experimental API at the project level. Add the following block to your module's build.gradle.kts:

kotlin {    compilerOptions {        jvmTarget = JvmTarget.fromTarget("17")        freeCompilerArgs.add("-opt-in=androidx.compose.foundation.style.ExperimentalFoundationStyleApi")    }}

Core workflows and guides

Refer to the official documentation to complete specific development tasks:

  • Basic Style Usage: To set backgrounds, sizes, and alignments on a component, follow the Compose Styles Fundamentals Guide [blocked].
  • State and Transitions: To configure property changes for state shifts (like pressed or hovered), follow the Animations and State-Based Styling Guide [blocked].
  • Architecture Trade offs: To decide when to use a Style versus a standard Modifier, follow the Styles versus Modifiers Comparison [blocked].
  • Theme Level Integration: To connect style definitions with custom themes, follow Theming with Styles [blocked] and Custom Themes in Compose [blocked].

Step-by-Step Migration Workflow

Step 1: Analyze theme structure

  1. Locate your central theme file (such as Theme.kt).
  2. Identify design tokens. Note references for colors, typography, and shapes (for example, LocalColorScheme, LocalTypography, or LocalShapes).
  3. If the project lacks Jetpack Compose dependencies, stop. Instruct the user to migrate to Jetpack Compose first.
  4. If the project imports androidx.compose.material.MaterialTheme, recommend migrating to Material 3 before proceeding.

Step 2: Establish ComponentStyles

  1. Create a new file named ComponentStyles.kt in your theme directory.

  2. Define a top-level data class to hold your component styles, for example, the Jetsnack one is called JetsnackStyles:

    kotlin
    object ExampleComponentStyles {    val customButtonStyle: Style = {
        }    val customTextFieldStyle: Style = {
        }}
    <br />
  3. Expose this class through your custom theme with a static reference, don't use CompositionLocals here as it's not required.

    kotlin
    @Immutableclass JetsnackTheme(    // other Design system properties) {    companion object {        val colors: CustomThemingWithStyles.JetsnackColors            @Composable @ReadOnlyComposable            get() = LocalJetsnackTheme.current.colors        // ...
            // add helper static reference        val styles: ComponentStyles = ComponentStyles    }}
    <br />
  4. Provide extensions on StyleScope to reference theme tokens directly if they are exposed using CompositionLocals. For example:

    kotlin
    val StyleScope.colors: JetsnackColors    get() = LocalJetsnackTheme.currentValue.colors
    val StyleScope.typography: androidx.compose.material3.Typography    get() = LocalJetsnackTheme.currentValue.typography
    val StyleScope.shapes: Shapes    get() = LocalJetsnackTheme.currentValue.shapes
    <br />

Step 3: Migrate a component to Styles API

For each custom component (for example, CustomButton), complete the following sequence:

  1. Establish a visual baseline (If an emulator is available):
    • If you CANNOT run an Android emulator: Skip this step entirely and proceed to Step 2.
    • If you CAN run an Android emulator: Perform the following to capture a baseline screenshot:
      • Option A: Locate and run an existing screenshot test for the component.
      • Option B (If no test exists): Create a test using the project's existing testing framework, then run it.
      • Option C (If no framework exists): Create a minimal screenshot test using UI Automator or Espresso, then run it.
  2. Remove individual styling parameters : Remove styling parameters such as backgroundColor, shape, textStyle, and contentPadding from the signature - anything that StyleScope supports.
  3. Add the style parameter : Add style: Style = Style to the function signature. Always ensure the default value is exactly Style (e.g., style: Style = Style) and not a specific style default like ChipStyleDefault or any other value.
  4. Declare state tracking : If the component is interactable, create a MutableStyleState using the interaction source. Update state fields (such as isEnabled) inside the Composable to track the state correctly.
  5. Apply styleable modifier : Replace specific layout modifiers on the root element with Modifier.styleable().
  6. Move defaults to ComponentStyles : Move hardcoded values from the component definition to a dedicated Style instance in ComponentStyles.kt.
  7. Validate component: Compare the baseline screenshot image taken at the start with the rendered Compose Preview of the new composable. Ignore string content; focus on layout and styling. Iterate on the Compose code until visual parity is achieved. Once verified, write a Compose UI test for the new composable.
Migration example

Before Migration:

kotlin
@Composablefun CustomButton(    onClick: () -> Unit,    modifier: Modifier = Modifier,    backgroundColor: Color = JetsnackTheme.colors.brandLight,    disabledBackgroundColor: Color = JetsnackTheme.colors.brandSecondary,    shape: Shape = JetsnackTheme.shapes.extraLarge,    textStyle: TextStyle = JetsnackTheme.typography.labelLarge,    enabled: Boolean = true,    content: @Composable RowScope.() -> Unit,) {    val interactionSource = remember { MutableInteractionSource() }    Row(        modifier            .clickable(onClick = onClick, indication = null, interactionSource = interactionSource)            .background(if (enabled) backgroundColor else disabledBackgroundColor, shape)            .defaultMinSize(58.dp, 40.dp),        horizontalArrangement = Arrangement.Center,        verticalAlignment = Alignment.CenterVertically,        content = content,    )}
<br />

After Migration:

kotlin
// Exposed via ComponentStyles.ktobject ComponentStyles {    val buttonStyle = Style {        background(colors.brandLight)        shape(shapes.extraLarge)        minWidth(58.dp)        minHeight(40.dp)        textStyle(typography.labelLarge)        disabled {            background(colors.brandSecondary)        }    }}
@Composablefun CustomButton(    onClick: () -> Unit,    modifier: Modifier = Modifier,    style: Style = Style,    enabled: Boolean = true,    content: @Composable RowScope.() -> Unit,) {    val interactionSource = remember { MutableInteractionSource() }    val styleState = rememberUpdatedStyleState(interactionSource) {        it.isEnabled = enabled    }    Row(        modifier            .clickable(onClick = onClick, indication = null, interactionSource = interactionSource)            .styleable(styleState, JetsnackTheme.styles.buttonStyle, style),        horizontalArrangement = Arrangement.Center,        verticalAlignment = Alignment.CenterVertically,        content = content,    )}
<br />

Step 4: Validate Changes

  1. Build the project. Verify that there are no compilation errors.
  2. Run your module's screenshot tests.
  3. Compare visual outputs of the whole app between the previous and updated components. Verify that no visual layout regressions occur.

来源与署名

来源:android/skills位于jetpack-compose/theming/styles提交42dc227

许可证: Complete terms in LICENSE.txt

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架

更多来自 android/skills 的技能

Wear Compose M3

android

指导构建、更新和迁移 Wear OS Compose Material3 应用,并提供规范组件示例与版本规则。

Software Development7.7K13天前更新

Display Glasses With Jetpack Compose Glimmer

android

Provides guidelines for developing projected Android XR apps for display glasses using the Jetpack Compose Glimmer UI toolkit. This skill covers foundational Glimmer design principles, workflows for implementing Jetpack Compose Glimmer, and interaction models for the glasses form factor. Use this skill to build an Android XR Augmented Experience app with Jetpack Compose Glimmer that adheres to the Glimmer design system for optimized glasses styling.

待分类7.7K13天前更新

Play Billing Library Version Upgrade

android

指导将 Android 项目从旧版 Google Play 结算库升级到最新稳定版本。

Software Development7.7K13天前更新

Leanback To Compose Tv Migration

android

Provides instructions and architectural patterns for migrating Android TV applications from legacy Leanback UI Toolkit, Android Views, or Support Fragments to Jetpack Compose for TV (androidx.tv). Use this skill for Leanback to Compose migrations, including browse screen, settings screen, authentication screen, login screen, or video playback screen migrations, or when replacing BrowseSupportFragment, LeanbackSettingsFragment, PreferenceFragment, BaseLeanbackPreferenceFragmentCompat, VideoSupportFragment, GuidedStepSupportFragment, SearchSupportFragment, VerticalGridSupportFragment, Presenter, ArrayObjectAdapter, or CursorMapper with modern Compose equivalents, implementing immersive carousels with focus memory, Media3 video playback with PlayerSurface, or custom 10-foot hero layouts.

待分类7.7K13天前更新

Testing Setup

android

分析 Android 项目的测试配置,并安装测试框架、测试装置以及单元、UI、截图和端到端测试。

Software Development7.7K13天前更新

Android Profiler

android

指导 Android 性能分析:录制系统跟踪、堆转储和方法记录,并使用 Perfetto SQL 进行分析。

Software Development7.7K13天前更新