Stili e modificatori

Gli stili si differenziano dai modificatori per progettazione. Gli stili non sostituiscono i modificatori, ma i due sistemi coesistono con obiettivi diversi. Internamente, uno stile è un modificatore. Puoi fare tutto ciò che puoi fare con gli stili 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 particolare composable e non vengono ereditati dal tema. Definisci l'aspetto visivo, le dimensioni dei singoli elementi e le proprietà modificabili del tema. Gli stili operano a livello di tema e possono essere sovrascritti a livello di componente. Vengono applicati a cascata e applicano lo stile a diversi composable.
Logica Additivi: i modificatori si combinano per formare un nuovo risultato. Sovrascrivibile: vince l'ultima proprietà impostata nello stile. Gli stili fungono da unico livello di proprietà che si sovrascrivono a vicenda in base a una gerarchia di precedenza definita.
Temi Difficile da inserire in un tema, normalmente utilizzato singolarmente. Per progettazione, gli stili sono applicabili ai temi (possono accedere a CompositionLocal) e 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 un buon rendimento dell'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 meno allocazione di oggetti.
Animazioni Richiede l'utilizzo di primitive di animazione separate come animate*AsState Funzionalità integrate nell'API animate { } 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, come descritto nel seguente elenco:

  • I modificatori vengono in genere creati nella fase di composizione. Gli aggiornamenti possono forzare una nuova esecuzione completa di Composizione, Layout e Disegno, anche per piccole modifiche visive come il colore, a meno che tu non crei modificatori basati su lambda.
  • I modificatori condizionali richiedono una logica if-else distruttiva all'interno delle catene fluenti. L'animazione richiede boilerplate di stato manuale e non dispone di un meccanismo "animazione automatica" ad alte prestazioni.
  • I modificatori si accumulano anziché sostituirsi. Non puoi sostituire il bordo predefinito di un componente, ma puoi disegnarne un secondo sopra.
  • I modificatori sono difficili da astrarre in temi globali. Di conseguenza, i temi di solito 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 perché non possono sostituire completamente i modificatori:

  • Gli stili sono modificatori specializzati. Mentre un modificatore può 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, spaziatura interna, 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 possibili delle proprietà 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 casi d'uso, le seguenti linee guida 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 "estratti" in un tema globale. Anziché passare modificatori ripetitivi a ogni componente, puoi definire un singolo stile nel tema per creare un aspetto uniforme in tutta l'app.
  • Quando esegui animazioni frequenti: gli stili vengono valutati durante le fasi Layout e Disegno, consentendo l'animazione di proprietà come colore o scala, bypassando completamente la fase di composizione. Ciò riduce notevolmente l'overhead delle prestazioni. Utilizza uno stile anziché un modificatore quando esegui animazioni delle proprietà visive.
  • Override e stacking:utilizza gli stili quando devi sostituire una proprietà predefinita. I modificatori sono additivi (l'aggiunta di un bordo ne impila un secondo), mentre gli stili utilizzano la logica "last-write-wins", che semplifica la sostituzione di sfondi o spaziatura interna senza ingombro visivo.
  • Personalizzazione dei componenti Material:se un componente Material fornisce un parametro di stile, questo è l'approccio suggerito per la personalizzazione. Questi stili ti consentono di accedere e modificare proprietà specifiche all'interno della struttura interna del composable che altrimenti potrebbero essere inaccessibili.