سبکها از نظر طراحی با اصلاحکنندهها متفاوت هستند. سبکها جایگزین اصلاحکنندهها نمیشوند؛ در عوض، این دو سیستم با اهداف متفاوت در کنار هم وجود دارند. از نظر داخلی، یک سبک یک اصلاحکننده است. شما میتوانید هر کاری را که سبکها میتوانند با اصلاحکنندهها انجام دهند، با اصلاحکنندهها انجام دهید، اما همه قابلیتهای اصلاحکنندهها در سبکها موجود نیست.
در زیر مقایسهای بین Styleها در مقابل modifierها آمده است:
| ویژگی | اصلاحکنندهها | سبکها |
|---|---|---|
| هدف اصلی | رفتارها، معناشناسی و طرحبندیهای پیچیده را تعریف کنید. اصلاحکنندهها عناصر منفرد را درجا برای یک ترکیب خاص دستکاری میکنند و از قالب به پایین منتقل نمیشوند. | ظاهر بصری، اندازهبندی تک تک آیتمها و ویژگیهای قابل تمبندی را تعریف کنید. استایلها در سطح تم عمل میکنند و در سطح کامپوننت قابل بازنویسی هستند. آنها به پایین میریزند و استایلبندی را در بین کامپوننتهای مختلف اعمال میکنند. |
| منطق | افزودنی - اصلاحکنندهها با هم ترکیب میشوند تا نتیجه جدیدی را تشکیل دهند. | قابل بازنویسی - آخرین ویژگی تنظیم شده در Style برنده میشود. Styleها به عنوان یک لایه واحد از ویژگیها عمل میکنند که بر اساس یک سلسله مراتب اولویت تعریف شده، یکدیگر را لغو میکنند. |
| قالببندی | تبدیل آن به یک تم خاص چالشبرانگیز است، و معمولاً به صورت جداگانه استفاده میشود. | از نظر طراحی، استایلها قابلیت تمبندی دارند (میتوانند به CompositionLocal دسترسی داشته باشند) و میتوانند یک بار تعریف شوند و در کامپوننتها استفاده شوند. |
| عملکرد | بهروزرسانیها اغلب به هر سه مرحلهی Compose نیاز دارند: ترکیببندی، طرحبندی و ترسیم. دستیابی به عملکرد خوب انیمیشن اصلاحکنندهها اغلب نیازمند نوشتن نسخههای مبتنی بر لامبدا است. | مرحله ترکیببندی را رد میکند، فقط در مرحله طرحبندی و ترسیم فعال است و ترکیببندیهای مجدد را کاهش میدهد. به تخصیص شیء کمتری نیاز دارد. |
| انیمیشنها | نیاز به استفاده از عناصر اولیه انیمیشن جداگانه مانند animate*AsState دارد. | دارای یک API داخلی برای animate { } است که برخی از انیمیشنها را برای شما مدیریت میکند. |
محدودیتهای اصلاحکنندهها
اصلاحکنندهها در چشمانداز فعلی Compose مزایای زیادی دارند. با این حال، Styles برخی از محدودیتهای اصلاحکنندهها را برطرف میکند که لیست زیر آنها را شرح میدهد:
- اصلاحکنندهها معمولاً در مرحله ترکیببندی ایجاد میشوند. بهروزرسانیها میتوانند حتی برای تغییرات بصری کوچک مانند رنگ، اجرای مجدد کامل ترکیببندی، طرحبندی و ترسیم را الزامی کنند، مگر اینکه اصلاحکنندههای مبتنی بر لامبدا ایجاد کنید.
- اصلاحکنندههای شرطی نیاز به منطق if-else مختلکننده در زنجیرههای fluent دارند. متحرکسازی آنها نیاز به کدهای آمادهی دستی دارد و فاقد مکانیزم "متحرکسازی خودکار" با کارایی بالا است.
- اصلاحکنندهها به جای جایگزینی، روی هم انباشته میشوند. شما نمیتوانید حاشیه پیشفرض یک کامپوننت را لغو کنید؛ فقط میتوانید حاشیه دوم را روی آن رسم کنید.
- خلاصه کردن اصلاحکنندهها در قالبهای سراسری دشوار است. در نتیجه، قالبها معمولاً به جای پیکربندیهای اصلاحکننده قابل استفاده مجدد، مقادیر خام را ذخیره میکنند.
محدودیتهای سبکها
اگرچه استایلها میتوانند برخی از خلاهای موجود در modifierها را پر کنند، اما محدودیتهایی نیز دارند که نشان میدهد چگونه نمیتوانند به طور کامل جایگزین modifierها شوند:
- سبکها اصلاحکنندههای تخصصی هستند. در حالی که یک اصلاحکننده میتواند هر کاری را که یک سبک انجام میدهد انجام دهد، عکس آن صادق نیست. در نتیجه، سبکها میتوانند مکمل اصلاحکنندهها باشند، اما نمیتوانند جایگزین آنها شوند.
- سبکها به پیکربندی بصری (پسزمینهها، فاصلهگذاری، حاشیهها) محدود میشوند. آنها نمیتوانند رفتارهایی مانند منطق کلیک، تشخیص ژست یا معانی دسترسی را مدیریت کنند.
- تبدیل یک سبک به حالت نهاییاش گرانتر از اعمال یک اصلاحکنندهی واحد است. سیستم باید یک ساختار داده شامل تمام مقادیر ممکن برای ویژگیها تولید کند و جستجوی ویژگیهای ارثبریشده این کار را پیچیدهتر میکند.
چه زمانی از Styles به جای Modifiers استفاده کنیم؟
اگرچه انتخاب استفاده از Styles تا حد زیادی به برنامه و موارد استفاده شما بستگی دارد، راهنماییهای زیر به تعیین زمان ترجیح دادن یک style به یک modifier کمک میکند:
- برای دستیابی به سازگاری در کل قالب: استایلها طوری طراحی شدهاند که به یک قالب سراسری "منتقل" شوند. به جای ارسال اصلاحکنندههای تکراری به هر کامپوننت، میتوانید یک استایل واحد در قالب خود تعریف کنید تا ظاهری یکپارچه در کل برنامه ایجاد شود.
- هنگام اجرای انیمیشنهای مکرر: سبکها در طول مراحل طرحبندی و ترسیم ارزیابی میشوند و به ویژگیهایی مانند رنگ یا مقیاس اجازه میدهند تا متحرک شوند، در حالی که مرحله ترکیببندی را به طور کامل دور میزنند. این امر به طور قابل توجهی سربار عملکرد را کاهش میدهد. هنگام انجام انیمیشنهای ویژگیهای بصری، از یک سبک به جای یک اصلاحکننده استفاده کنید.
- بازنویسی در مقابل انباشت: از Styles زمانی استفاده کنید که نیاز به جایگزینی یک ویژگی پیشفرض دارید. اصلاحکنندهها افزایشی هستند (اضافه کردن یک حاشیه، حاشیه دوم را انباشته میکند)، در حالی که Styles از منطق "آخرین نوشتن-برنده شدن" استفاده میکند و تعویض پسزمینهها یا فاصلهگذاری را بدون شلوغی بصری آسانتر میکند.
- سفارشیسازی کامپوننتهای متریال: اگر یک کامپوننت متریال پارامتر Style را ارائه دهد، این رویکرد برای سفارشیسازی پیشنهاد میشود. این استایلها به شما امکان میدهند به ویژگیهای خاصی در ساختار داخلی composable دسترسی داشته باشید و آنها را تغییر دهید که در غیر این صورت ممکن است غیرقابل دسترسی باشند.