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 hacen los diseños con modificadores, pero no todas las funciones de los modificadores están disponibles en los diseños.
A continuación, se incluye una comparación entre los modificadores y los estilos:
| Función | Modificadores | Estilos |
|---|---|---|
| Objetivo principal | Definir comportamientos, semántica 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 temáticas. Los estilos operan a nivel del tema y se pueden anular a nivel del componente. Se filtran y aplican el diseño en diferentes elementos componibles. |
| Lógica | Aditivos: Los modificadores se combinan para formar un nuevo resultado. | Se puede anular: Prevalece la última propiedad establecida en el diseño. Los diseños 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 de incorporar en un tema y, por lo general, se usa de forma individual. | Por diseño, los estilos son compatibles con temas (pueden acceder a CompositionLocals), se pueden definir una vez y se pueden usar 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 es necesario escribir versiones basadas en expresiones lambda. | Omitir la fase de composición, solo 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 una API de 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, Styles aborda 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 Composición, Diseño y Dibujo, incluso para pequeños cambios visuales, como el color, a menos que crees modificadores basados en expresiones lambda.
- Los modificadores condicionales requieren lógica if-else disruptiva dentro de las cadenas fluidas. Animarlos requiere código repetitivo de estado manual y carece de un mecanismo de "animación automática" de alto rendimiento.
- Los modificadores se acumulan en lugar de reemplazarse. No puedes anular el borde predeterminado de un componente; solo puedes dibujar un segundo borde sobre él.
- Los modificadores son difíciles de abstraer en temas globales. Por lo tanto, los temas suelen almacenar valores sin procesar en lugar de configuraciones de modificadores reutilizables.
Limitaciones de los estilos
Si bien los estilos pueden completar algunas de las brechas que tienen los modificadores, también tienen algunas limitaciones, lo que demuestra 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 Style, lo contrario no es cierto. Por lo tanto, los estilos pueden complementar, pero no reemplazar, a los modificadores.
- Los estilos se limitan a la configuración visual (fondos, relleno, bordes). No pueden controlar comportamientos como la lógica de clics, la detección de gestos o la semántica de accesibilidad.
- Resolver un objeto Style 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 este proceso.
Cuándo usar estilos en lugar de modificadores
Si bien la elección de usar Styles depende en gran medida de tu app y tus casos de uso, la siguiente guía te ayudará a determinar cuándo preferir un estilo en lugar de un modificador:
- Para lograr coherencia en todo el tema: Los diseños se crean para "elevarse" a un tema global. En lugar de pasar Modifiers repetitivos a cada componente, puedes definir un solo Style 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 sin pasar por la fase de composición. Esto reduce significativamente la sobrecarga de rendimiento. Usa un objeto Style en lugar de un modificador cuando realices animaciones de propiedades visuales.
- Anulación vs. apilamiento: Usa Styles cuando necesites reemplazar una propiedad predeterminada. Los modificadores son aditivos (agregar un borde apila un segundo), mientras que los estilos usan la lógica de "última escritura gana", lo que facilita el intercambio de fondos o padding sin desorden visual.
- Personaliza los componentes de Material: Si un componente de Material proporciona un parámetro de estilo, este es el enfoque sugerido para la personalización. Estos estilos te permiten acceder a propiedades específicas dentro de la estructura interna del elemento componible que, de otro modo, podrían ser inaccesibles, y modificarlas.