Pular para o conteúdo
Skillpedia
Apps de celular280 mil · #27

compose-multiplatform-patterns

Ajuda seu agente a usar padrões do Compose Multiplatform e Jetpack Compose em projetos KMP. Ele cobre gerenciamento de estado, navegação, temas e performance. Útil para criar interfaces de usuário consistentes.

O que ela faz

Este guia ensina como organizar e construir interfaces de usuário (telas) para aplicativos que funcionam em várias plataformas (como Android, iOS, Web e Desktop) usando uma tecnologia chamada Compose Multiplatform. Ele cobre como gerenciar informações que mudam (estado), como navegar entre telas, como definir o visual (temas) e como fazer tudo funcionar rápido.

Quando usar

  • ✓Ao criar a interface de um app para Android, iOS, Web ou Desktop.
  • ✓Ao gerenciar informações que mudam na tela.
  • ✓Ao organizar a navegação entre as diferentes partes do app.

Exemplo do que pedir para a IA

“Como posso organizar o estado da minha tela de lista de produtos em um app Compose Multiplatform?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/compose-multiplatform-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/compose-multiplatform-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele mostra exemplos de código e padrões para gerenciar dados que mudam na tela, criar navegação segura entre telas e otimizar o desempenho. Você pode usar essas técnicas para construir apps mais robustos e eficientes.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill compose-multiplatform-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/compose-multiplatform-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões do Compose Multiplatform

Padrões para construir UI compartilhada entre Android, iOS, Desktop e Web usando Compose Multiplatform e Jetpack Compose. Abrange gerenciamento de estado, navegação, temas e performance.

Quando Ativar

  • Construindo UI com Compose (Jetpack Compose ou Compose Multiplatform)
  • Gerenciando estado da UI com ViewModels e estado do Compose
  • Implementando navegação em projetos KMP ou Android
  • Projetando composables reutilizáveis e sistemas de design
  • Otimizando recomposição e performance de renderização

Gerenciamento de Estado

ViewModel + Objeto de Estado Único

Use uma única data class para o estado da tela. Exponha-a como StateFlow e colete no Compose:

data class ItemListState(
    val items: List<Item> = emptyList(),
    val isLoading: Boolean = false,
    val error: String? = null,
    val searchQuery: String = ""
)

class ItemListViewModel(
    private val getItems: GetItemsUseCase
) : ViewModel() {
    private val _state = MutableStateFlow(ItemListState())
    val state: StateFlow<ItemListState> = _state.asStateFlow()

    fun onSearch(query: String) {
        _state.update { it.copy(searchQuery = query) }
        loadItems(query)
    }

    private fun loadItems(query: String) {
        viewModelScope.launch {
            _state.update { it.copy(isLoading = true) }
            getItems(query).fold(
                onSuccess = { items -> _state.update { it.copy(items = items, isLoading = false) } },
                onFailure = { e -> _state.update { it.copy(error = e.message, isLoading = false) } }
            )
        }
    }
}

Coletando Estado no Compose

@Composable
fun ItemListScreen(viewModel: ItemListViewModel = koinViewModel()) {
    val state by viewModel.state.collectAsStateWithLifecycle()

    ItemListContent(
        state = state,
        onSearch = viewModel::onSearch
    )
}

@Composable
private fun ItemListContent(
    state: ItemListState,
    onSearch: (String) -> Unit
) {
    // Stateless composable — easy to preview and test
}

Padrão Event Sink

Para telas complexas, use uma sealed interface para eventos em vez de múltiplos lambdas de callback:

sealed interface ItemListEvent {
    data class Search(val query: String) : ItemListEvent
    data class Delete(val itemId: String) : ItemListEvent
    data object Refresh : ItemListEvent
}

// In ViewModel
fun onEvent(event: ItemListEvent) {
    when (event) {
        is ItemListEvent.Search -> onSearch(event.query)
        is ItemListEvent.Delete -> deleteItem(event.itemId)
        is ItemListEvent.Refresh -> loadItems(_state.value.searchQuery)
    }
}

// In Composable — single lambda instead of many
ItemListContent(
    state = state,
    onEvent = viewModel::onEvent
)

Navegação

Navegação Type-Safe (Compose Navigation 2.8+)

Defina rotas como objetos @Serializable:

@Serializable data object HomeRoute
@Serializable data class DetailRoute(val id: String)
@Serializable data object SettingsRoute

@Composable
fun AppNavHost(navController: NavHostController = rememberNavController()) {
    NavHost(navController, startDestination = HomeRoute) {
        composable<HomeRoute> {
            HomeScreen(onNavigateToDetail = { id -> navController.navigate(DetailRoute(id)) })
        }
        composable<DetailRoute> { backStackEntry ->
            val route = backStackEntry.toRoute<DetailRoute>()
            DetailScreen(id = route.id)
        }
        composable<SettingsRoute> { SettingsScreen() }
    }
}

Navegação de Diálogo e Bottom Sheet

Use padrões dialog() e de overlay em vez de show/hide imperativo:

NavHost(navController, startDestination = HomeRoute) {
    composable<HomeRoute> { /* ... */ }
    dialog<ConfirmDeleteRoute> { backStackEntry ->
        val route = backStackEntry.toRoute<ConfirmDeleteRoute>()
        ConfirmDeleteDialog(
            itemId = route.itemId,
            onConfirm = { navController.popBackStack() },
            onDismiss = { navController.popBackStack() }
        )
    }
}

Design Composable

APIs Baseadas em Slots

Projete composables com parâmetros de slot para flexibilidade:

@Composable
fun AppCard(
    modifier: Modifier = Modifier,
    header: @Composable () -> Unit = {},
    content: @Composable ColumnScope.() -> Unit,
    actions: @Composable RowScope.() -> Unit = {}
) {
    Card(modifier = modifier) {
        Column {
            header()
            Column(content = content)

…
Perguntas frequentes

O que é 'estado' em um aplicativo?

Estado é qualquer informação que pode mudar com o tempo e que afeta o que o usuário vê na tela. Por exemplo, se um botão está clicado, o texto em um campo de entrada ou uma lista de itens carregando.

O que significa 'navegação type-safe'?

Significa que o sistema de navegação verifica se você está indo para telas válidas e passando as informações corretas, ajudando a evitar erros antes mesmo de o aplicativo rodar.

Como posso fazer minha interface funcionar mais rápido?

O guia sugere usar 'tipos estáveis' e garantir que listas de itens sejam carregadas de forma eficiente, evitando que a interface precise redesenhar partes desnecessárias.

Detalhes

Descrição original do autor

Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI. Use when building Compose or Jetpack Compose UI, state, navigation, or theming in a KMP project.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#27
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas