Los estilos difieren de los modificadores por diseño. Los estilos no reemplazan a los modificadores. En cambio, los dos sistemas coexisten con diferentes objetivos. Internamente, un estilo es un modificador. Puedes hacer todo lo que los estilos pueden hacer con los modificadores, pero no todas las funciones de los modificadores están disponibles en los estilos.
A continuación, se muestra una comparación entre los estilos y los modificadores:
| Función | Modificadores | Estilos |
|---|---|---|
| Objetivo principal | Define comportamientos, semánticas y diseños complejos. Los modificadores manipulan elementos individuales sobre la marcha para un elemento componible en particular y no se filtran desde el tema. | Define la apariencia visual, el tamaño de los elementos individuales y las propiedades que se pueden aplicar al tema. Los estilos operan a nivel del tema y se pueden sobrescribir a nivel del componente. Se filtran y aplican estilos en diferentes elementos componibles. |
| Lógica | Aditiva: Los modificadores se combinan para formar un resultado nuevo. | Sobrescribible: Gana la última propiedad establecida en el estilo. Los estilos actúan como una sola capa de propiedades que se anulan entre sí según una jerarquía de precedencia definida. |
| Temas | Es difícil incorporarlos a un tema y, por lo general, se usan de forma individual. | Por diseño, los estilos se pueden aplicar al tema (pueden acceder a CompositionLocals), se pueden definir una vez y usarse en todos los componentes. |
| Rendimiento | Las actualizaciones suelen requerir las tres fases de Compose: composición, diseño y dibujo. Para lograr un buen rendimiento de animación de los modificadores, a menudo se requiere escribir versiones basadas en lambda. | Omite la fase de composición, solo está activo en la fase de diseño y dibujo, lo que reduce las recomposiciones. Requiere menos asignación de objetos. |
| Animaciones | Requiere el uso de primitivas de animación separadas, como animate*AsState. |
Incluye la API animate { } integrada que controla algunas animaciones por ti. |
Limitaciones de los modificadores
Los modificadores tienen muchos beneficios en el panorama actual de Compose. Sin embargo, los estilos abordan algunas limitaciones de los modificadores, que se describen en la siguiente lista:
- Por lo general, los modificadores se crean en la fase de composición. Las actualizaciones pueden forzar una nueva ejecución completa de la composición, el diseño y el dibujo, incluso para cambios visuales pequeños, como el color, a menos que crees modificadores basados en lambda.
- Los modificadores condicionales requieren una lógica if-else disruptiva dentro de cadenas fluidas. Para animarlos, se requiere un boilerplate de estado manual y carece de un mecanismo de "animación automática" de alto rendimiento.
- Los modificadores se apilan en lugar de reemplazarse. No puedes anular el borde predeterminado de un componente. Solo puedes dibujar uno segundo en la parte superior.
- Los modificadores son difíciles de abstraer en temas globales. En consecuencia, los temas suelen almacenar valores sin procesar en lugar de configuraciones de modificadores reutilizables.
Limitaciones de los estilos
Si bien los estilos pueden llenar algunas de las brechas que tienen los modificadores, también tienen algunas limitaciones, que muestran que no pueden reemplazar por completo a los modificadores:
- Los estilos son modificadores especializados. Si bien un modificador puede hacer todo lo que hace un estilo, lo contrario no es cierto. En consecuencia, los estilos pueden complementar, pero no reemplazar, a los modificadores.
- Los estilos se limitan a la configuración visual (fondos, padding, bordes). No pueden controlar comportamientos como la lógica de clics, la detección de gestos o la semántica de accesibilidad.
- Resolver un estilo en su estado final es más costoso que aplicar un solo modificador. El sistema debe generar una estructura de datos que contenga todos los valores de propiedad posibles, y la búsqueda de propiedades heredadas complica aún más esto.
Cuándo usar estilos en lugar de modificadores
Si bien la elección de usar estilos depende en gran medida de tu app y de los casos de uso, la siguiente guía te ayuda a determinar cuándo preferir un estilo en lugar de un modificador:
- Para lograr coherencia en todo el tema: Los estilos están diseñados para "incorporarse" a un tema global. En lugar de pasar modificadores repetitivos a cada componente, puedes definir un solo estilo en tu tema para crear una apariencia unificada en toda la app.
- Cuando se realizan animaciones frecuentes: Los estilos se evalúan durante las fases de diseño y dibujo, lo que permite que las propiedades como el color o la escala se animen mientras se omite por completo la fase de composición. Esto reduce significativamente la sobrecarga de rendimiento. Usa un estilo en lugar de un modificador cuando realices animaciones de propiedades visuales.
- Anulación en comparación con el apilamiento: Usa estilos cuando necesites reemplazar una propiedad predeterminada. Los modificadores son aditivos (agregar un borde apila un segundo), mientras que los estilos usan la lógica "last-write-wins", lo que facilita el intercambio de fondos o padding sin desorden visual.
- Personalización de componentes de Material: Si un componente de Material proporciona un parámetro de estilo, es el enfoque sugerido para la personalización. Estos estilos te permiten acceder y modificar propiedades específicas dentro de la estructura interna del elemento componible que, de lo contrario, podrían ser inaccesibles.