סגנונות לעומת משנים

הסגנונות שונים מהמשנים בכוונה. סגנונות לא מחליפים את התוספים, אלא שתי המערכות פועלות במקביל עם מטרות שונות. באופן פנימי, סגנון הוא תוסף. אפשר לבצע את כל הפעולות שאפשר לבצע באמצעות Styles באמצעות שינויים, אבל לא כל הפונקציונליות של שינויים זמינה ב-Styles.

ההשוואה הבאה היא בין סגנונות לבין משנים:

תכונה גורמי שינוי סגנונות
יעד ראשי הגדרת התנהגויות, סמנטיקה ופריסות מורכבות. המשנים משפיעים על רכיבים בודדים בזמן אמת עבור קומפוזיציה מסוימת, והם לא עוברים בירושה מהנושא. הגדרת המראה החזותי, הגודל של כל פריט ומאפיינים שניתנים להתאמה אישית. הסגנונות פועלים ברמת העיצוב, ואפשר לשנות אותם ברמת הרכיב. הם מועברים למטה ומחילים עיצוב על רכיבים שונים שניתנים להרכבה.
Logic תוספיות – השילוב של התוספים יוצר תוצאה חדשה. ניתן להחלפה – המאפיין האחרון שמוגדר בסגנון הוא זה שייקבע. סגנונות פועלים כשכבה אחת של מאפיינים שמבטלים אחד את השני על סמך היררכיית קדימות מוגדרת.
עיצוב לפי נושא קשה להשתמש בהם כחלק מעיצוב, בדרך כלל משתמשים בהם בנפרד. הסגנונות מתוכננים כך שאפשר להחיל עליהם ערכות נושא (יש להם גישה ל-CompositionLocals), ואפשר להגדיר אותם פעם אחת ולהשתמש בהם ברכיבים שונים.
ביצועים עדכונים לרוב דורשים את כל שלושת השלבים של Compose: קומפוזיציה, פריסה וציור. כדי להשיג ביצועים טובים של אנימציה של משנים, צריך לכתוב גרסאות מבוססות-lambda. הקומפוננטה מדלגת על שלב ההרכבה, פעילה רק בשלב הפריסה והציור, ומצמצמת את מספר ההרכבות מחדש. נדרשת הקצאה של פחות אובייקטים.
אנימציות נדרש שימוש בפרימיטיבים נפרדים של אנימציה כמו animate*AsState תכונות מובנות ב-animate { } API שמטפל בחלק מהאנימציות בשבילכם.

המגבלות של משני המיקום

לשימוש במאפייני שינוי יש הרבה יתרונות בסביבת Compose הנוכחית. עם זאת, סגנונות פותרים חלק מהמגבלות של שינויים, שמפורטות ברשימה הבאה:

  • בדרך כלל יוצרים את התוספים בשלב ההרכבה. עדכונים יכולים לכפות הפעלה מחדש מלאה של Composition,‏ Layout ו-Draw, גם לשינויים חזותיים קטנים כמו צבע, אלא אם יוצרים משנים מבוססי-lambda.
  • שינויים מותנים דורשים לוגיקת if-else משבשת בתוך שרשראות רציפות. הנפשתם דורשת קוד boilerplate ידני של מצב, ואין מנגנון 'הנפשה אוטומטית' עם ביצועים גבוהים.
  • המשנים מצטברים ולא מחליפים אחד את השני. אי אפשר לשנות את גבול ברירת המחדל של רכיב, אפשר רק לצייר גבול שני מעליו.
  • קשה להסיק מהמשנים נושאים גלובליים. לכן, בדרך כלל ערכות נושא מאחסנות ערכים גולמיים במקום הגדרות של משנים שאפשר לעשות בהן שימוש חוזר.

מגבלות של סגנונות

סגנונות יכולים למלא חלק מהפערים שנוצרים בגלל שינויים, אבל יש להם גם כמה מגבלות שמראות שהם לא יכולים להחליף לחלוטין את השינויים:

  • סגנונות הם משנים ייעודיים. אפשר להשתמש במאפיין modifier כדי לעשות כל מה שאפשר לעשות עם מאפיין Style, אבל אי אפשר להשתמש במאפיין Style כדי לעשות כל מה שאפשר לעשות עם מאפיין modifier. לכן, סגנונות יכולים להשלים את השינויים, אבל לא להחליף אותם.
  • הסגנונות מוגבלים להגדרות חזותיות (רקעים, שוליים, גבולות). הם לא יכולים לטפל בהתנהגויות כמו לוגיקת קליקים, זיהוי מחוות או סמנטיקה של נגישות.
  • המרת סגנון למצב הסופי שלו יקרה יותר מהוספה של משנה אחד. המערכת צריכה ליצור מבנה נתונים שמכיל את כל הערכים האפשריים של המאפיינים, והחיפוש של מאפיינים שעברו בירושה מסבך את זה עוד יותר.

מתי כדאי להשתמש בסגנונות במקום במאפייני שינוי

ההחלטה אם להשתמש בסגנונות תלויה בעיקר באפליקציה ובתרחישי השימוש שלכם, אבל ההנחיות הבאות יעזרו לכם להבין מתי עדיף להשתמש בסגנון במקום במאפיין:

  • כדי להשיג עקביות בכל העיצוב: הסגנונות מיועדים ל'העברה' לעיצוב גלובלי. במקום להעביר משנים חוזרים לכל רכיב, אפשר להגדיר סגנון יחיד בערכת הנושא כדי ליצור מראה אחיד בכל האפליקציה.
  • כשמבצעים אנימציות בתדירות גבוהה: המערכת מעריכה את הסגנונות במהלך השלבים 'פריסה' ו'ציור', וכך מאפשרת להנפיש מאפיינים כמו צבע או קנה מידה בלי לעבור בכלל את השלב 'קומפוזיציה'. הפעולה הזו מצמצמת באופן משמעותי את תקורה הביצועים. כדאי להשתמש ב-Style במקום ב-modifier כשמבצעים אנימציות של מאפיינים חזותיים.
  • החלפה לעומת הוספה: משתמשים ב-Styles כשצריך להחליף מאפיין ברירת מחדל. השינויים שמוסיפים באמצעות modifiers מצטברים (אם מוסיפים גבול, מוסיפים עוד אחד), ואילו השינויים שמוסיפים באמצעות Styles פועלים לפי הלוגיקה של 'הכתיבה האחרונה קובעת', ולכן קל יותר להחליף רקעים או מרווחים בלי ליצור עומס ויזואלי.
  • התאמה אישית של רכיבי Material: אם רכיב Material מספק פרמטר Style, זו הגישה המומלצת להתאמה אישית. הסגנונות האלה מאפשרים לכם לגשת למאפיינים ספציפיים במבנה הפנימי של הרכיב המורכב ולשנות אותם, מאפיינים שאולי לא תהיה לכם גישה אליהם בדרך אחרת.