Styles et modificateurs

Les styles sont différents des modificateurs par conception. Les styles ne remplacent pas les modificateurs. Au contraire, les deux systèmes coexistent avec des objectifs différents. En interne, un style est un modificateur. Vous pouvez effectuer toutes les actions possibles avec les styles à l'aide des modificateurs, mais toutes les fonctionnalités des modificateurs ne sont pas disponibles dans les styles.

Voici une comparaison entre les styles et les modificateurs :

Fonctionnalité Modificateurs Styles
Objectif principal Définissez des comportements, des sémantiques et des mises en page complexes. Les modificateurs manipulent des éléments individuels à la volée pour un composable particulier et ne sont pas hérités du thème. Définissez l'apparence visuelle, la taille des éléments individuels et les propriétés thématiques. Les styles fonctionnent au niveau du thème et peuvent être remplacés au niveau du composant. Elles se propagent et appliquent un style à différents composables.
Logique Additif : les modificateurs se combinent pour former un nouveau résultat. Remplaçable : la dernière propriété définie dans le style l'emporte. Les styles agissent comme une seule couche de propriétés qui se remplacent mutuellement en fonction d'une hiérarchie de priorité définie.
Thèmes Difficile à intégrer dans un thème, généralement utilisé individuellement. Par conception, les styles sont thématiques (ils peuvent accéder aux CompositionLocal) et peuvent être définis une seule fois et utilisés dans les composants.
Performances Les mises à jour nécessitent souvent les trois phases de Compose : composition, mise en page et dessin. Pour obtenir de bonnes performances d'animation des modificateurs, il est souvent nécessaire d'écrire des versions basées sur lambda. Ignore la phase de composition et n'est actif que dans les phases de mise en page et de dessin, ce qui réduit les recompositions. Nécessite moins d'allocation d'objets.
Animations Nécessite l'utilisation de primitives d'animation distinctes telles que animate*AsState Fonctionnalités intégrées à l'API animate { } qui gère certaines animations pour vous.

Limites des modificateurs

Les modificateurs présentent de nombreux avantages dans le paysage Compose actuel. Toutefois, les styles permettent de résoudre certaines limites des modificateurs, décrites dans la liste suivante :

  • Les modificateurs sont généralement créés lors de la phase de composition. Les mises à jour peuvent forcer une réexécution complète de la composition, de la mise en page et du dessin, même pour de petits changements visuels comme la couleur, sauf si vous créez des modificateurs basés sur des expressions lambda.
  • Les modificateurs conditionnels nécessitent une logique if-else perturbatrice dans les chaînes fluides. Pour les animer, il faut un boilerplate d'état manuel et il manque un mécanisme d'animation automatique performant.
  • Les modificateurs s'empilent au lieu de se remplacer. Vous ne pouvez pas remplacer la bordure par défaut d'un composant. Vous ne pouvez qu'en dessiner une deuxième par-dessus.
  • Il est difficile d'abstraire les modificateurs en thèmes généraux. Par conséquent, les thèmes stockent généralement des valeurs brutes au lieu de configurations de modificateurs réutilisables.

Limites des styles

Bien que les styles puissent combler certaines lacunes des modificateurs, ils présentent également certaines limites qui montrent qu'ils ne peuvent pas remplacer entièrement les modificateurs :

  • Les styles sont des modificateurs spécialisés. Alors qu'un modificateur peut faire tout ce qu'un style fait, l'inverse n'est pas vrai. Par conséquent, les styles peuvent compléter les modificateurs, mais pas les remplacer.
  • Les styles sont limités à la configuration visuelle (arrière-plans, marges intérieures, bordures). Elles ne peuvent pas gérer les comportements tels que la logique de clic, la détection de gestes ou la sémantique d'accessibilité.
  • La résolution d'un style dans son état final est plus coûteuse que l'application d'un seul modificateur. Le système doit générer une structure de données contenant toutes les valeurs de propriété possibles, et la recherche des propriétés héritées complique encore la tâche.

Quand utiliser des styles plutôt que des modificateurs

Bien que le choix d'utiliser des styles dépende en grande partie de votre application et de vos cas d'utilisation, les conseils suivants vous aideront à déterminer quand préférer un style à un modificateur :

  • Pour assurer la cohérence de l'ensemble du thème : les styles sont conçus pour être "transférés" dans un thème global. Au lieu de transmettre des modificateurs répétitifs à chaque composant, vous pouvez définir un style unique dans votre thème pour créer une apparence unifiée dans toute l'application.
  • Lorsque vous effectuez des animations fréquentes : les styles sont évalués pendant les phases de mise en page et de dessin, ce qui permet aux propriétés telles que la couleur ou l'échelle d'être animées tout en contournant complètement la phase de composition. Cela réduit considérablement les frais généraux liés aux performances. Utilisez un style au lieu d'un modificateur lorsque vous effectuez des animations de propriétés visuelles.
  • Remplacer ou empiler : utilisez les styles lorsque vous devez remplacer une propriété par défaut. Les modificateurs sont additifs (l'ajout d'une bordure en empile une deuxième), tandis que les styles utilisent une logique de "dernière écriture l'emporte", ce qui facilite le remplacement des arrière-plans ou des marges intérieures sans encombrement visuel.
  • Personnaliser les composants Material : si un composant Material fournit un paramètre de style, il s'agit de l'approche suggérée pour la personnalisation. Ces styles vous permettent d'accéder à des propriétés spécifiques de la structure interne du composable et de les modifier, ce qui pourrait être impossible autrement.