Gli stili differiscono dai modificatori in base al tipo di progettazione. Gli stili non sostituiscono i modificatori; al contrario, i due sistemi coesistono con obiettivi diversi. Internamente, uno stile è un modificatore. Puoi fare tutto ciò che gli stili possono fare con i modificatori, ma non tutte le funzionalità dei modificatori sono disponibili negli stili.
Di seguito è riportato un confronto tra stili e modificatori:
| Funzionalità | Modificatori | Stili |
|---|---|---|
| Obiettivo principale | Definisci comportamenti, semantica e layout complessi. I modificatori manipolano i singoli elementi al volo per un determinato elemento componibile e non vengono ereditati dal tema. | Definisci l'aspetto visivo, le dimensioni dei singoli elementi e le proprietà applicabili ai temi. Gli stili operano a livello di tema e possono essere sovrascritti a livello di componente. Vengono ereditati e applicano lo stile a diversi elementi componibili. |
| Logica | Additiva: i modificatori si combinano per formare un nuovo risultato. | Sovrascrivibile: la proprietà impostata per ultima nello stile ha la precedenza. Gli stili fungono da singolo livello di proprietà che si sovrascrivono a vicenda in base a una gerarchia di precedenza definita. |
| Temi | Difficile da inserire in un tema, in genere utilizzato singolarmente. | Per progettazione, gli stili sono applicabili ai temi (possono accedere a CompositionLocals), possono essere definiti una sola volta e utilizzati in tutti i componenti. |
| Prestazioni | Gli aggiornamenti spesso richiedono tutte e tre le fasi di Compose: composizione, layout e disegno. Per ottenere buone prestazioni di animazione dei modificatori, spesso è necessario scrivere versioni basate su lambda. | Salta la fase di composizione, è attivo solo nella fase di layout e disegno, riducendo le ricomposizioni. Richiede una minore allocazione di oggetti. |
| Animazioni | Richiede l'utilizzo di primitive di animazione separate come animate*AsState |
Include l'API animate { } integrata che gestisce alcune animazioni per te. |
Limitazioni dei modificatori
I modificatori offrono molti vantaggi nell'attuale panorama di Compose. Tuttavia, gli stili risolvono alcune limitazioni dei modificatori, descritte nel seguente elenco:
- I modificatori vengono in genere creati nella fase di composizione. Gli aggiornamenti possono forzare una riesecuzione completa di Composizione, Layout e Disegno, anche per piccole modifiche visive come il colore, a meno che non crei modificatori basati su lambda.
- I modificatori condizionali richiedono una logica if-else di interruzione all'interno delle catene fluide. L'animazione richiede boilerplate di stato manuale e manca di un meccanismo di "animazione automatica" ad alte prestazioni.
- I modificatori si sovrappongono anziché sostituirsi. Non puoi sostituire il bordo predefinito di un componente, ma puoi solo disegnarne un secondo sopra.
- I modificatori sono difficili da astrarre in temi globali. Di conseguenza, i temi in genere memorizzano valori non elaborati anziché configurazioni di modificatori riutilizzabili.
Limitazioni degli stili
Sebbene gli stili possano colmare alcune lacune dei modificatori, presentano anche alcune limitazioni che dimostrano che non possono sostituire completamente i modificatori:
- Gli stili sono modificatori specializzati. Sebbene un modificatore possa fare tutto ciò che fa uno stile, il contrario non è vero. Di conseguenza, gli stili possono integrare, ma non sostituire, i modificatori.
- Gli stili sono limitati alla configurazione visiva (sfondi, padding, bordi). Non possono gestire comportamenti come la logica dei clic, il rilevamento dei gesti o la semantica di accessibilità.
- La risoluzione di uno stile nel suo stato finale è più costosa dell'applicazione di un singolo modificatore. Il sistema deve generare una struttura di dati contenente tutti i valori delle proprietà possibili e la ricerca delle proprietà ereditate complica ulteriormente questa operazione.
Quando utilizzare gli stili anziché i modificatori
Sebbene la scelta di utilizzare gli stili dipenda in gran parte dalla tua app e dai tuoi casi d'uso, le seguenti indicazioni ti aiutano a determinare quando preferire uno stile a un modificatore:
- Per ottenere una coerenza a livello di tema: gli stili sono progettati per essere "inseriti" in un tema globale. Anziché passare modificatori ripetitivi a ogni componente, puoi definire un singolo stile nel tema per creare un aspetto unificato in tutta l'app.
- Quando esegui animazioni frequenti: gli stili vengono valutati durante le fasi di layout e disegno, consentendo l'animazione di proprietà come colore o scala, bypassando completamente la fase di composizione. In questo modo si riduce notevolmente il sovraccarico delle prestazioni. Utilizza uno stile anziché un modificatore quando esegui animazioni di proprietà visive.
- Sostituzione e sovrapposizione: utilizza gli stili quando devi sostituire una proprietà predefinita. I modificatori sono additivi (l'aggiunta di un bordo ne sovrappone un secondo), mentre gli stili utilizzano la logica "last-write-wins", che semplifica la sostituzione di sfondi o padding senza ingombri visivi.
- Personalizzazione dei componenti Material: se un componente Material fornisce un parametro Style, è l'approccio consigliato per la personalizzazione. Questi stili ti consentono di accedere e modificare proprietà specifiche all'interno della struttura interna dell'elemento componibile che altrimenti potrebbero essere inaccessibili.