ثبات در Compose

Compose انواع را پایدار یا ناپایدار در نظر می گیرد. یک نوع در صورتی پایدار است که تغییرناپذیر باشد، یا اگر برای Compose امکان داشته باشد بداند که آیا مقدار آن بین ترکیب‌های مجدد تغییر کرده است یا خیر. یک نوع ناپایدار است اگر Compose نتواند بفهمد که آیا مقدار آن بین ترکیب‌های مجدد تغییر کرده است یا خیر.

Compose از ثبات پارامترهای یک composable برای تعیین اینکه آیا می تواند در طول ترکیب مجدد از composable صرف نظر کند یا خیر استفاده می کند:

  • پارامترهای پایدار: اگر یک composable پارامترهای پایداری داشته باشد که تغییر نکرده باشند، Compose آن را رد می کند.
  • پارامترهای ناپایدار: اگر یک composable پارامترهای ناپایدار داشته باشد، Compose همیشه زمانی که والد جزء را دوباره ترکیب می کند، آن را دوباره ترکیب می کند.

اگر برنامه شما شامل بسیاری از مؤلفه‌های ناپایدار غیرضروری است که Compose همیشه دوباره ترکیب می‌کند، ممکن است مشکلات عملکرد و سایر مشکلات را مشاهده کنید.

در این سند توضیح داده شده است که چگونه می توانید ثبات برنامه خود را برای بهبود عملکرد و تجربه کلی کاربر افزایش دهید.

اشیاء تغییرناپذیر

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

کلاس Contact یک کلاس داده غیرقابل تغییر است. این به این دلیل است که تمام پارامترهای آن ابتدایی هستند که با کلمه کلیدی val تعریف شده اند. هنگامی که یک نمونه از Contact ایجاد می کنید، نمی توانید مقدار ویژگی های شی را تغییر دهید. اگر سعی می کردید این کار را انجام دهید، یک شی جدید ایجاد می کنید.

data class Contact(val name: String, val number: String)

Composable ContactRow دارای پارامتری از نوع Contact است.

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

در نظر بگیرید چه اتفاقی می‌افتد وقتی کاربر روی دکمه جابجایی کلیک می‌کند و حالت selected تغییر می‌کند:

  1. Compose ارزیابی می کند که آیا باید کد داخل ContactRow را دوباره بنویسد.
  2. می بیند که تنها آرگومان برای ContactDetails از نوع Contact است.
  3. از آنجایی که Contact یک کلاس داده غیرقابل تغییر است، Compose مطمئن است که هیچ یک از آرگومان های ContactDetails تغییر نکرده است.
  4. به این ترتیب، Compose از ContactDetails صرفنظر می کند و آن را دوباره ترکیب نمی کند.
  5. از سوی دیگر، آرگومان‌های ToggleButton تغییر کرده‌اند و Compose آن مؤلفه را دوباره ترکیب می‌کند.

اشیاء قابل تغییر

در حالی که مثال قبلی از یک شیء تغییرناپذیر استفاده می کند، امکان ایجاد یک شیء تغییرپذیر وجود دارد. قطعه زیر را در نظر بگیرید:

data class Contact(var name: String, var number: String)

از آنجایی که هر پارامتر Contact اکنون یک var است، کلاس دیگر تغییرناپذیر نیست. اگر ویژگی های آن تغییر کند، Compose آگاه نمی شود. این به این دلیل است که Compose فقط تغییرات اشیاء Compose State را ردیابی می کند.

Compose چنین کلاسی را ناپایدار می داند. Compose از ترکیب مجدد کلاس‌های ناپایدار نمی‌گذرد. به این ترتیب، اگر Contact به این شکل تعریف می‌شد، ContactRow در مثال قبلی هر زمان که selected می‌شد، دوباره ترکیب می‌کرد.

پیاده سازی در Compose

در نظر گرفتن اینکه چگونه Compose دقیقاً تعیین می‌کند کدام توابع در حین ترکیب مجدد نادیده گرفته شود، می‌تواند مفید باشد، هرچند مهم نیست.

هنگامی که کامپایلر Compose روی کد شما اجرا می شود، هر تابع و نوع را با یکی از چندین تگ علامت گذاری می کند. این برچسب‌ها نشان می‌دهند که Compose چگونه تابع یا نوع را در حین ترکیب مجدد مدیریت می‌کند.

توابع

نوشتن می تواند توابع را به عنوان skippable یا restartable علامت گذاری کند. توجه داشته باشید که ممکن است یک تابع را به عنوان یکی، هر دو یا هیچ یک از اینها علامت گذاری کند:

  • Skippable : اگر کامپایلر یک composable را به عنوان قابل پرش علامت گذاری کند، Compose می تواند آن را در حین ترکیب مجدد رد کند اگر همه آرگومان های آن با مقادیر قبلی خود برابر باشند.
  • Restartable : قابل ترکیبی که قابل راه اندازی مجدد است به عنوان یک "محدوده" عمل می کند که در آن ترکیب مجدد می تواند شروع شود. به عبارت دیگر، تابع می تواند نقطه ورود باشد که Compose می تواند پس از تغییر حالت، اجرای مجدد کد را برای ترکیب مجدد شروع کند.

انواع

انواع علامت‌ها را به‌عنوان غیرقابل تغییر یا پایدار بنویسید. هر نوع یکی یا دیگری است:

  • Immutable : در صورتی که مقدار ویژگی های آن هرگز تغییر نکند و همه روش ها به صورت ارجاعی شفاف باشند، Compose یک نوع را به عنوان تغییرناپذیر علامت گذاری می کند.
    • توجه داشته باشید که همه انواع اولیه به عنوان غیر قابل تغییر علامت گذاری شده اند. اینها عبارتند از String , Int , و Float .
  • پایدار : نوعی را نشان می دهد که خواص آن می تواند پس از ساخت تغییر کند. اگر و زمانی که این ویژگی ها در طول زمان اجرا تغییر کنند، Compose از آن تغییرات آگاه می شود.

پایداری اشکال زدایی

اگر برنامه شما در حال ترکیب مجدد است که پارامترهای آن تغییر نکرده است، ابتدا تعریف آن را برای پارامترهایی که به وضوح قابل تغییر هستند بررسی کنید. Compose همیشه یک مؤلفه را مجدداً ترکیب می‌کند، اگر یک نوع با ویژگی‌های var یا یک ویژگی val که از یک نوع ناپایدار شناخته شده استفاده می‌کند، ارسال کنید.

برای اطلاعات دقیق در مورد نحوه تشخیص مشکلات پیچیده پایداری در Compose، به راهنمای پایداری Debug مراجعه کنید.

رفع مشکلات پایداری

برای کسب اطلاعات در مورد چگونگی ایجاد ثبات در اجرای Compose، به راهنمای رفع مشکلات پایداری مراجعه کنید.

خلاصه

به طور کلی باید به نکات زیر توجه کنید:

  • پارامترها : Compose پایداری هر یک از پارامترهای composable شما را تعیین می کند تا مشخص کند که در طول ترکیب مجدد از کدام یک از مواد composable باید صرف نظر کرد.
  • رفع فوری : اگر متوجه شدید که composable شما نادیده گرفته نمی‌شود و باعث ایجاد مشکل در عملکرد می‌شود ، ابتدا باید دلایل واضح بی‌ثباتی مانند پارامترهای var را بررسی کنید.
  • گزارش های کامپایلر : می توانید از گزارش های کامپایلر برای تعیین اینکه چه ثباتی در مورد کلاس های شما استنباط می شود استفاده کنید.
  • مجموعه‌ها : نوشتن همیشه کلاس‌های مجموعه را ناپایدار می‌داند، مانند List, Set و Map . این به این دلیل است که نمی توان تضمین کرد که آنها تغییر ناپذیر هستند. می‌توانید به جای آن از مجموعه‌های تغییرناپذیر Kotlinx استفاده کنید یا کلاس‌های خود را به‌عنوان @Immutable یا @Stable حاشیه‌نویسی کنید.
  • سایر ماژول‌ها : Compose همیشه مکان‌هایی را که از ماژول‌هایی که کامپایلر Compose در آنها اجرا نمی‌شود ناپایدار در نظر می‌گیرد. در صورت لزوم، کلاس‌ها را در کلاس‌های مدل UI قرار دهید.

در ادامه مطلب