حالت پرش قوی

Strong Skipping حالتی است که در کامپایلر Compose موجود است. هنگامی که فعال می شود، رفتار کامپایلر را به دو صورت تغییر می دهد:

  • کامپوزیتی با پارامترهای ناپایدار قابل رد شدن است
  • لامبداهایی با ضبط ناپایدار به یاد می‌آیند

حالت پرش قوی را فعال کنید

برای فعال کردن پرش قوی برای یک ماژول Gradle، گزینه زیر را در بلوک composeCompiler پیکربندی Gradle خود قرار دهید:

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

قابلیت پرش قابل ترکیب

حالت پرش قوی، برخی از قوانین پایداری را که معمولاً توسط کامپایلر Compose اعمال می‌شود، در مورد پرش و توابع قابل ترکیب، کاهش می‌دهد. به‌طور پیش‌فرض، کامپایلر Compose یک تابع composable را به‌عنوان قابل پرش علامت‌گذاری می‌کند، اگر همه آرگومان‌های آن دارای مقادیر پایدار باشند. حالت پرش قوی این را تغییر می دهد.

با فعال کردن پرش قوی، همه توابع قابل تنظیم مجدد قابل رد شدن می شوند. این موضوع چه پارامترهای ناپایدار داشته باشند یا نه اعمال می شود. توابع غیر قابل تنظیم مجدد غیر قابل رد شدن باقی می مانند.

چه زمانی باید رد شد

برای تعیین اینکه آیا از یک composable در حین ترکیب مجدد صرفنظر شود، Compose مقدار هر پارامتر را با مقادیر قبلی آنها مقایسه می کند. نوع مقایسه بستگی به پایداری پارامتر دارد.

  • پارامترهای ناپایدار با استفاده از برابری نمونه مقایسه می شوند ( === )
  • پارامترهای پایدار با استفاده از برابری شیء مقایسه می شوند ( Object.equals() )

اگر همه پارامترها این الزامات را برآورده کنند، Compose در طول ترکیب مجدد از composable صرفنظر می کند.

ممکن است برای انصراف از پرش قوی، یک ترکیب ساز بخواهید. به این معنی که ممکن است شما یک ترکیب قابل راه اندازی مجدد اما غیر قابل رد شدن بخواهید. در این مورد، از حاشیه نویسی @NonSkippableComposable استفاده کنید.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

کلاس ها را به عنوان پایدار حاشیه نویسی کنید

اگر می خواهید یک شی از برابری شی به جای برابری نمونه استفاده کند، به حاشیه نویسی کلاس داده شده با @Stable ادامه دهید. یک مثال از زمانی که ممکن است مجبور شوید این کار را انجام دهید این است که هنگام مشاهده یک لیست کامل از اشیاء، منابع داده مانند Room، هر زمان که یکی از آنها تغییر کند، اشیاء جدیدی را برای هر آیتم در لیست تخصیص می دهد.

حافظه لامبدا

حالت پرش قوی همچنین به خاطر سپردن بیشتر لامبداها در داخل اجزای سازنده امکان می‌دهد. با فعال کردن پرش قوی، هر لامبدا در یک تابع قابل ترکیب به طور خودکار به خاطر سپرده می شود.

نمونه ها

برای دستیابی به یادداشت لامبدا در داخل اجزای سازنده هنگام استفاده از پرش قوی، کامپایلر لامبدای شما را با یک remember به خاطر بسپارید. با ضبط لامبدا کلید خورده است.

موردی را در نظر بگیرید که در آن شما یک لامبدا دارید مانند مثال زیر:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

با فعال کردن پرش قوی، کامپایلر لامبدا را با قرار دادن آن در یک فراخوان به remember بسپارد:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

کلیدها از قوانین مقایسه مشابه توابع ترکیبی پیروی می کنند. زمان اجرا کلیدهای ناپایدار را با استفاده از برابری نمونه مقایسه می کند. این کلیدهای پایدار را با استفاده از برابری شی مقایسه می کند.

یادداشت و ترکیب مجدد

این بهینه‌سازی تعداد اجزای سازنده‌ای را که زمان اجرا در حین ترکیب مجدد حذف می‌شود، به شدت افزایش می‌دهد. بدون حافظه، زمان اجرا به احتمال زیاد یک لامبدا جدید را به هر ترکیبی که یک پارامتر لامبدا را در طول ترکیب مجدد می گیرد اختصاص می دهد. در نتیجه، لامبدای جدید دارای پارامترهایی است که با آخرین ترکیب برابری نمی کند. این منجر به ترکیب مجدد می شود.

از حفظ کردن بپرهیزید

اگر لامبدا دارید که نمی‌خواهید آن را به خاطر بسپارید، از حاشیه‌نویسی @DontMemoize استفاده کنید.

val lambda = @DontMemoize {
    ...
}

اندازه APK

هنگام کامپایل، Composable های قابل رد شدن باعث تولید کد بیشتری نسبت به composable هایی می شود که قابل رد شدن نیستند. با فعال کردن پرش قوی، کامپایلر تقریباً همه کامپوزیشن‌ها را به‌عنوان قابل رد شدن علامت‌گذاری می‌کند و همه لامبداها را در یک remember{...} . به همین دلیل، فعال کردن حالت پرش قوی تأثیر بسیار کمی بر اندازه APK برنامه شما دارد.

فعال کردن پرش قوی در Now In Android اندازه APK را تا 4 کیلوبایت افزایش داد. تفاوت در اندازه تا حد زیادی به تعداد مواردی که قبلاً قابل رد شدن نبودند بستگی دارد که در برنامه داده شده وجود داشتند، اما باید نسبتاً جزئی باشند.