הסגנונות שונים מהמשנים בכוונה. סגנונות לא מחליפים את שינויי ההגדרות, אלא שתי המערכות פועלות במקביל עם מטרות שונות. באופן פנימי, סגנון הוא שינוי הגדרה. אפשר לבצע את כל הפעולות שאפשר לבצע באמצעות Styles גם באמצעות modifiers, אבל לא כל הפונקציונליות של modifiers זמינה ב-Styles.
ההשוואה הבאה היא בין סגנונות לבין משנים:
| תכונה | גורמי שינוי | סגנונות |
|---|---|---|
| יעד ראשי | הגדרת התנהגויות, סמנטיקה ופריסות מורכבות. המשנים משפיעים על רכיבים בודדים תוך כדי תנועה עבור רכיב שאפשר להרכיב, והם לא עוברים מהנושא. | הגדרת המראה החזותי, הגודל של כל פריט ומאפיינים שניתנים להתאמה אישית. הסגנונות פועלים ברמת העיצוב וניתן לשכתב אותם ברמת הרכיב. הם מועברים למטה ומחילים עיצוב על רכיבים שונים שניתנים להרכבה. |
| Logic | תוספיות – השילוב של המאפיינים יוצר תוצאה חדשה. | ניתן להחלפה – המאפיין האחרון שמוגדר בסגנון הוא זה שייקבע. סגנונות פועלים כשכבה אחת של מאפיינים שמבטלים אחד את השני על סמך היררכיית קדימות מוגדרת. |
| שיוך לנושאים | קשה להשתמש בהם כחלק מעיצוב, בדרך כלל משתמשים בהם בנפרד. | הסגנונות מיועדים להגדרה של נושאים (יש להם גישה ל-CompositionLocals), ואפשר להגדיר אותם פעם אחת ולהשתמש בהם ברכיבים שונים. |
| ביצועים | עדכונים לרוב דורשים את כל שלושת השלבים של Compose: קומפוזיציה, פריסה וציור. כדי להשיג ביצועים טובים של אנימציות של משנים, צריך לכתוב גרסאות מבוססות למדה. | הוא מדלג על שלב ההרכבה, פעיל רק בשלב הפריסה והציור, ומצמצם את מספר ההרכבות מחדש. נדרשת הקצאה של פחות אובייקטים. |
| אנימציות | נדרש שימוש בפרימיטיבים נפרדים של אנימציה כמו animate*AsState |
תכונות מובנות ב-animate { } API שמטפל בחלק מהאנימציות בשבילכם. |
המגבלות של משני המיקום
לשימוש במאפייני שינוי יש הרבה יתרונות בסביבת Compose הנוכחית. עם זאת, יש כמה מגבלות על שימוש במאפייני שינוי, והן מתוארות ברשימה הבאה:
- בדרך כלל יוצרים את המאפיינים המשנים בשלב ההרכבה. עדכונים יכולים לכפות הרצה מלאה של Composition, Layout ו-Draw, גם לשינויים חזותיים קטנים כמו צבע, אלא אם יוצרים משנים מבוססי-lambda.
- שינויים מותנים דורשים לוגיקה משבשת של if-else בתוך שרשראות fluent. הנפשתם דורשת קוד boilerplate ידני של מצב, ואין מנגנון 'הנפשה אוטומטית' עם ביצועים גבוהים.
- המשנים מצטברים ולא מחליפים אחד את השני. אי אפשר לשנות את ברירת המחדל של גבולות הרכיב, אפשר רק לצייר גבול שני מעל.
- קשה להפוך את השינויים האלה לעיצובים גלובליים. לכן, בדרך כלל ערכי הגלם מאוחסנים בערכות הנושא במקום הגדרות של משנים שאפשר לעשות בהם שימוש חוזר.
המגבלות של סגנונות
סגנונות יכולים למלא חלק מהפערים שנוצרים בגלל שינויים, אבל יש להם גם כמה מגבלות שמראות שהם לא יכולים להחליף לגמרי את השינויים:
- סגנונות הם משנים מיוחדים. אפשר להשתמש במאפיין modifier כדי לעשות כל מה שאפשר לעשות עם מאפיין Style, אבל אי אפשר להשתמש במאפיין Style כדי לעשות כל מה שאפשר לעשות עם מאפיין modifier. לכן, סגנונות יכולים להשלים את השימוש במאפייני שינוי, אבל לא להחליף אותם.
- הסגנונות מוגבלים להגדרות חזותיות (רקעים, שוליים, גבולות). הם לא יכולים לטפל בהתנהגויות כמו לוגיקה של קליקים, זיהוי תנועות או סמנטיקה של נגישות.
- הפיכת סגנון למצב הסופי שלו יקרה יותר מהוספה של משנה אחד. המערכת צריכה ליצור מבנה נתונים שמכיל את כל הערכים האפשריים של המאפיינים, והחיפוש של מאפיינים שעברו בירושה מסבך את זה עוד יותר.
מתי כדאי להשתמש בסגנונות במקום במאפייני שינוי
ההחלטה אם להשתמש בסגנונות תלויה בעיקר באפליקציה ובתרחישי השימוש שלכם, אבל ההנחיות הבאות יעזרו לכם להבין מתי עדיף להשתמש בסגנון ולא במאפיין:
- כדי להשיג עקביות בכל העיצוב: הסגנונות מיועדים ל'העברה' לעיצוב גלובלי. במקום להעביר שוב ושוב את אותם משנים לכל רכיב, אפשר להגדיר סגנון אחד בערכת הנושא כדי ליצור מראה אחיד בכל האפליקציה.
- כשמבצעים אנימציות בתדירות גבוהה: המערכת מעריכה את הסגנונות במהלך השלבים 'פריסה' ו'ציור', וכך מאפשרת להנפיש מאפיינים כמו צבע או קנה מידה בלי לעבור בכלל את השלב 'קומפוזיציה'. הפעולה הזו מפחיתה באופן משמעותי את תקורה הביצועים. כדאי להשתמש ב-Style במקום ב-modifier כשמבצעים אנימציות של מאפיינים חזותיים.
- החלפה לעומת הוספה: משתמשים בסגנונות כשצריך להחליף מאפיין ברירת מחדל. השינויים שנעשים באמצעות מאפייני שינוי הם מצטברים (הוספת גבול מוסיפה עוד גבול), ואילו השינויים שנעשים באמצעות סגנונות מבוססים על הלוגיקה של 'הכתיבה האחרונה קובעת', ולכן קל יותר להחליף רקעים או מרווחים בלי ליצור עומס חזותי.
- התאמה אישית של רכיבי Material: אם רכיב Material מספק פרמטר Style, זו הגישה המומלצת להתאמה אישית. הסגנונות האלה מאפשרים לכם לגשת למאפיינים ספציפיים במבנה הפנימי של הרכיב המורכב ולשנות אותם, מאפיינים שאולי לא תהיה לכם גישה אליהם בדרך אחרת.