Os estilos diferem dos modificadores por design. Os estilos não substituem os modificadores. Em vez disso, os dois sistemas coexistem com objetivos diferentes. Internamente, um estilo é um modificador. Você pode fazer tudo o que os estilos fazem com modificadores, mas nem todas as funcionalidades dos modificadores estão disponíveis nos estilos.
Confira a seguir uma comparação entre estilos e modificadores:
| Recurso | Modificadores | Estilos |
|---|---|---|
| Meta principal | Definir comportamentos, semântica e layouts complexos. Os modificadores manipulam elementos individuais de maneira dinâmica para um elemento combinável específico e não são transmitidos do tema. | Defina a aparência visual, o dimensionamento de itens individuais e as propriedades temáticas. Os estilos operam no nível do tema e podem ser substituídos no nível do componente. Elas são transmitidas e aplicam estilos em diferentes elementos combináveis. |
| Lógica | Aditivo: os modificadores se combinam para formar um novo resultado. | Substituível: a última propriedade definida no estilo vence. Os estilos funcionam como uma única camada de propriedades que se substituem com base em uma hierarquia de precedência definida. |
| Temas | Difícil de incluir em um tema, normalmente usado individualmente. | Por design, os estilos podem ser tematizados (eles podem acessar CompositionLocals) e definidos uma vez e usados em todos os componentes. |
| Desempenho | As atualizações geralmente exigem as três fases do Compose: composição, layout e desenho. Para conseguir uma boa performance de animação dos modificadores, geralmente é necessário escrever versões baseadas em lambda. | Pula a fase de composição, só fica ativo na fase de layout e desenho, reduzindo as recomposições. Requer menos alocação de objetos. |
| Animações | Exige o uso de primitivos de animação separados, como animate*AsState |
Tem uma API animate { } integrada que processa algumas animações para você. |
Limitações dos modificadores
Os modificadores têm muitos benefícios no cenário atual do Compose. No entanto, os estilos resolvem algumas limitações dos modificadores, conforme descrito na lista a seguir:
- Os modificadores geralmente são criados na fase de composição. As atualizações podem forçar uma nova execução completa de composição, layout e exibição, mesmo para pequenas mudanças visuais como cor, a menos que você crie modificadores baseados em lambda.
- Os modificadores condicionais exigem uma lógica if-else disruptiva em cadeias fluentes. Para animá-los, é necessário um boilerplate de estado manual, e não há um mecanismo de "animação automática" de alta performance.
- Os modificadores são acumulados, não substituídos. Não é possível substituir a borda padrão de um componente. Você só pode desenhar uma segunda borda por cima.
- É difícil abstrair modificadores em temas globais. Consequentemente, os temas geralmente armazenam valores brutos em vez de configurações de modificadores reutilizáveis.
Limitações dos estilos
Embora os estilos possam preencher algumas das lacunas dos modificadores, eles também têm algumas limitações, que mostram como não podem substituir totalmente os modificadores:
- Os estilos são modificadores especializados. Um modificador pode fazer tudo o que um estilo faz, mas o contrário não é verdadeiro. Consequentemente, os estilos podem complementar, mas não substituir, os modificadores.
- Os estilos são limitados à configuração visual (fundos, padding, bordas). Elas não podem processar comportamentos como lógica de clique, detecção de gestos ou semântica de acessibilidade.
- Resolver um estilo no estado final é mais caro do que aplicar um único modificador. O sistema precisa gerar uma estrutura de dados com todos os valores de propriedade possíveis, e a pesquisa de propriedades herdadas complica ainda mais isso.
Quando usar estilos em vez de modificadores
Embora a escolha de usar estilos dependa muito do seu app e dos casos de uso, as orientações a seguir ajudam a determinar quando preferir um estilo em vez de um modificador:
- Para alcançar consistência em todo o tema:os estilos são projetados para serem "transferidos" para um tema global. Em vez de transmitir Modificadores repetitivos para cada componente, você pode definir um único Estilo no tema para criar uma aparência unificada em todo o app.
- Ao realizar animações frequentes:os estilos são avaliados durante as fases de layout e exibição, permitindo que propriedades como cor ou escala sejam animadas sem passar pela fase de composição. Isso reduz significativamente a sobrecarga de desempenho. Use um estilo em vez de um modificador ao fazer animações de propriedades visuais.
- Substituição x empilhamento:use estilos quando precisar substituir uma propriedade padrão. Os modificadores são cumulativos (adicionar uma borda empilha uma segunda), enquanto os estilos usam a lógica "última gravação vence", facilitando a troca de planos de fundo ou padding sem poluição visual.
- Personalização de componentes do Material:se um componente do Material fornecer um parâmetro de estilo, essa será a abordagem sugerida para personalização. Com esses estilos, é possível acessar e modificar propriedades específicas na estrutura interna do elemento combinável que, de outra forma, seriam inacessíveis.