Style a modyfikatory

Style różnią się od modyfikatorów. Style nie zastępują modyfikatorów. Oba systemy współistnieją i mają różne cele. Wewnętrznie styl jest modyfikatorem. Za pomocą modyfikatorów możesz zrobić wszystko, co jest możliwe w przypadku stylów, ale nie wszystkie funkcje modyfikatorów są dostępne w stylach.

Poniżej znajdziesz porównanie stylów i modyfikatorów:

Funkcja Modyfikatory Style
Cel główny Definiowanie zachowań, semantyki i złożonych układów. Modyfikatory manipulują poszczególnymi elementami w locie w przypadku konkretnego komponentu i nie są dziedziczone z motywu. Definiowanie wyglądu, rozmiaru poszczególnych elementów i właściwości, które można dostosować do motywu. Style działają na poziomie motywu i można je zastępować na poziomie komponentu. Są dziedziczone i stosują style w różnych komponentach.
Logika Addytywna – modyfikatory łączą się, tworząc nowy wynik. Można je zastępować – wygrywa ostatnia właściwość ustawiona w stylu. Style działają jako pojedyncza warstwa właściwości, które zastępują się nawzajem na podstawie zdefiniowanej hierarchii pierwszeństwa.
Motywy Trudno je przenieść do motywu, zwykle używane pojedynczo. Style są z założenia dostosowywane do motywu (mogą uzyskiwać dostęp do CompositionLocals) i można je zdefiniować raz i używać w różnych komponentach.
Wydajność Aktualizacje często wymagają wszystkich 3 faz Compose: kompozycji, układu i rysowania. Aby uzyskać dobrą wydajność animacji modyfikatorów, często trzeba napisać wersje oparte na lambdach. Pomija fazę kompozycji, jest aktywny tylko w fazie układu i rysowania, co zmniejsza liczbę ponownych kompozycji. Wymaga mniejszej alokacji obiektów.
Animacje Wymaga użycia osobnych elementów pierwotnych animacji, takich jak animate*AsState. Zawiera wbudowany interfejs API animate { }, który obsługuje niektóre animacje.

Ograniczenia modyfikatorów

Modyfikatory mają wiele zalet w obecnym środowisku Compose. Style rozwiązują jednak niektóre ograniczenia modyfikatorów, które opisujemy na poniższej liście:

  • Modyfikatory są zwykle tworzone w fazie kompozycji. Aktualizacje mogą wymuszać pełne ponowne uruchomienie kompozycji, układu i rysowania, nawet w przypadku niewielkich zmian wizualnych, takich jak kolor, chyba że utworzysz modyfikatory oparte na lambdach.
  • Modyfikatory warunkowe wymagają zakłócającej logiki if-else w płynnych łańcuchach. Animowanie ich wymaga ręcznego tworzenia kodu stanu i nie ma mechanizmu „automatycznej animacji” o wysokiej wydajności.
  • Modyfikatory są układane w stos, a nie zastępowane. Nie możesz zastąpić domyślnej obramowania komponentu. Możesz tylko narysować drugie na wierzchu.
  • Modyfikatory trudno jest abstrahować do motywów globalnych. W związku z tym motywy zwykle przechowują wartości pierwotne zamiast konfiguracji modyfikatorów, których można używać ponownie.

Ograniczenia stylów

Style mogą wypełnić niektóre luki, które mają modyfikatory, ale mają też pewne ograniczenia, które pokazują, że nie mogą całkowicie zastąpić modyfikatorów:

  • Style to wyspecjalizowane modyfikatory. Modyfikator może zrobić wszystko, co robi styl, ale nie odwrotnie. W związku z tym style mogą uzupełniać modyfikatory, ale nie mogą ich zastępować.
  • Style są ograniczone do konfiguracji wizualnej (tła, dopełnienie, obramowania). Nie mogą obsługiwać zachowań takich jak logika kliknięcia, wykrywanie gestów czy semantyka ułatwień dostępu.
  • Rozwiązanie stylu do jego stanu końcowego jest droższe niż zastosowanie pojedynczego modyfikatora. System musi wygenerować strukturę danych zawierającą wszystkie możliwe wartości właściwości, a wyszukiwanie właściwości dziedziczonych dodatkowo to komplikuje.

Kiedy używać stylów zamiast modyfikatorów

Wybór stylów zależy w dużej mierze od aplikacji i przypadków użycia, ale poniższe wskazówki pomogą Ci określić, kiedy lepiej użyć stylu niż modyfikatora:

  • Aby zapewnić spójność w całym motywie: style są zaprojektowane tak, aby można je było „przenieść” do motywu globalnego. Zamiast przekazywać powtarzające się modyfikatory do każdego komponentu, możesz zdefiniować pojedynczy styl w motywie, aby utworzyć jednolity wygląd w całej aplikacji.
  • Podczas wykonywania częstych animacji: style są oceniane w fazie układu i rysowania, co pozwala animować właściwości takie jak kolor czy skala, całkowicie pomijając fazę kompozycji. Znacznie zmniejsza to obciążenie wydajności. W przypadku animacji właściwości wizualnych używaj stylu zamiast modyfikatora.
  • Zastępowanie a układanie w stos: używaj stylów, gdy musisz zastąpić domyślną właściwość. Modyfikatory są addytywne (dodanie obramowania powoduje ułożenie drugiego na wierzchu), a style używają logiki „ostatni zapis wygrywa”, co ułatwia zamianę tła lub dopełnienia bez wizualnego bałaganu.
  • Dostosowywanie komponentów Material: jeśli komponent Material udostępnia parametr stylu, jest to sugerowane podejście do dostosowywania. Te style umożliwiają dostęp do określonych właściwości w strukturze wewnętrznej komponentu, które w innym przypadku mogą być niedostępne, i ich modyfikowanie.