Styles et modificateurs

Les styles diffèrent des modificateurs par conception. Les styles ne remplacent pas les modificateurs. Au lieu de cela, les deux systèmes coexistent avec des objectifs différents. En interne, un style est un modificateur. Vous pouvez faire tout ce que les styles peuvent faire avec des modificateurs, mais toutes les fonctionnalités des modificateurs ne sont pas disponibles dans les styles.

Vous trouverez ci-dessous une comparaison entre les styles et les modificateurs :

Fonctionnalité Modificateurs Styles
Objectif principal Définir des comportements, une sémantique et des mises en page complexes. Les modificateurs manipulent des éléments individuels à la volée pour un composable particulier et ne sont pas transmis par le thème. Définir l'apparence visuelle, le dimensionnement 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. Ils sont transmis et appliquent un style à différents composables.
Logique Additive : les modificateurs se combinent pour former un nouveau résultat. Remplaçable : la dernière propriété définie dans le style est prioritaire. 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 CompositionLocals), peuvent être définis une seule fois et utilisés dans tous 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, n'est actif que dans la phase 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 Comporte une API animate { } intégrée 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 résolvent certaines limites des modificateurs, comme décrit 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 petites modifications visuelles telles que la couleur, sauf si vous créez des modificateurs basés sur lambda.
  • Les modificateurs conditionnels nécessitent une logique if-else perturbatrice dans les chaînes fluides. Leur animation nécessite un code réutilisable d'état manuel et ne dispose pas d'un mécanisme "auto-animate" hautes performances.
  • Les modificateurs s'empilent plutôt que 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 au-dessus.
  • Les modificateurs sont difficiles à abstraire dans des thèmes globaux. 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. Bien qu'un modificateur puisse 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, marge intérieure, bordures). Ils ne peuvent pas gérer les comportements tels que la logique de clic, la détection des 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 davantage cette opération.

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 aident à déterminer quand préférer un style à un modificateur :

  • Pour assurer la cohérence à l'échelle du thème : les styles sont conçus pour être "intégrés" dans un thème global. Au lieu de transmettre des modificateurs répétitifs à chaque composant, vous pouvez définir un seul style dans votre thème pour créer une apparence unifiée dans toute l'application.
  • Lors de l'exécution d'animations fréquentes : les styles sont évalués lors des phases de mise en page et de dessin, ce qui permet d'animer des propriétés telles que la couleur ou l'échelle tout en contournant entièrement la phase de composition. Cela réduit considérablement la surcharge des performances. Utilisez un style au lieu d'un modificateur lorsque vous effectuez des animations de propriétés visuelles.
  • Remplacement ou empilement : utilisez des 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 la logique "last-write-wins", ce qui facilite le remplacement des arrière-plans ou de la marge intérieure sans encombrement visuel.
  • Personnalisation des 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 et de les modifier dans la structure interne du composable, qui pourraient autrement être inaccessibles.