Compose Ui

new-silvermoon/awesome-android-agent-skills/.github/skills/ui/compose-ui

作者 new-silvermoon82900eacc8dbe13de93c6310af27b9df4b2bd2f6无许可证收录于 2026年10月9日更新于 2026年10月9日

Best practices for building UI with Jetpack Compose, focusing on state hoisting, detailed performance optimizations, and theming. Use this when writing or refactoring Composable functions.

AI 生成的概览

Jetpack Compose 界面开发规范,涵盖状态提升、修饰符、性能优化、主题与预览。

功能
该技能提供使用 Jetpack Compose 构建 Android 界面的最佳实践指导。内容涉及状态提升与单向数据流、修饰符的约定与顺序、remember、derivedStateOf 与 lambda 稳定性等性能技巧、Material 主题,以及预览函数。它输出的是书面建议与代码模式,而不是生成文件。
适用场景
在编写或重构 Composable 函数、希望统一状态、修饰符、性能与主题方面的约定时使用。也适合在审查 Compose 代码中的重组问题或预览覆盖情况时参考。
运行要求
无需任何工具、依赖包或凭据;仅为说明性内容,不附带脚本。

Jetpack Compose Best Practices

Instructions

Follow these guidelines to create performant, reusable, and testable Composables.

1. State Hoisting (Unidirectional Data Flow)

Make Composables stateless whenever possible by moving state to the caller.

  • Pattern: Function signature should usually look like:
    kotlin
    @Composablefun MyComponent(    value: String,              // State flows down    onValueChange: (String) -> Unit, // Events flow up    modifier: Modifier = Modifier // Standard modifier parameter)
  • Benefit: Decouples the UI from simple state storage, making it easier to preview and test.
  • ViewModel Integration: The screen-level Composable retrieves state from the ViewModel (viewModel.uiState.collectAsStateWithLifecycle()) and passes it down.

2. Modifiers

  • Default Parameter: Always provide a modifier: Modifier = Modifier as the first optional parameter.
  • Application: Apply this modifier to the root layout element of your Composable.
  • Ordering matters: padding().clickable() is different from clickable().padding(). Generally apply layout-affecting modifiers (like padding) after click listeners if you want the padding to be clickable.

3. Performance Optimization

  • remember: Use remember { ... } to cache expensive calculations across recompositions.
  • derivedStateOf: Use derivedStateOf { ... } when a state changes frequently (like scroll position) but the UI only needs to react to a threshold or summary (e.g., show "Jump to Top" button). This prevents unnecessary recompositions.
    kotlin
    val showButton by remember {    derivedStateOf { listState.firstVisibleItemIndex > 0 }}
  • Lambda Stability: Prefer method references (e.g., viewModel::onEvent) or remembered lambdas to prevent unstable types from triggering recomposition of children.

4. Theming and Resources

  • Use MaterialTheme.colorScheme and MaterialTheme.typography instead of hardcoded colors or text styles.
  • Organize simple UI components into specific files (e.g., DesignSystem.kt or Components.kt) if they are shared across features.

5. Previews

  • Create a private preview function for every public Composable.
  • Use @Preview(showBackground = true) and include Light/Dark mode previews if applicable.
  • Pass dummy data (static) to the stateless Composable for the preview.

来源与署名

来源:new-silvermoon/awesome-android-agent-skills位于.github/skills/ui/compose-ui提交82900ea

许可证: 无许可证

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

举报或申请下架