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
تغییر میکند:
- Compose ارزیابی می کند که آیا باید کد داخل
ContactRow
را دوباره بنویسد. - می بیند که تنها آرگومان برای
ContactDetails
از نوعContact
است. - از آنجایی که
Contact
یک کلاس داده غیرقابل تغییر است، Compose مطمئن است که هیچ یک از آرگومان هایContactDetails
تغییر نکرده است. - به این ترتیب، Compose از
ContactDetails
صرفنظر می کند و آن را دوباره ترکیب نمی کند. - از سوی دیگر، آرگومانهای
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 قرار دهید.
در ادامه مطلب
- عملکرد : برای نکات بیشتر در مورد اشکالزدایی درباره عملکرد نوشتن، راهنمای بهترین روشها و گفتگوی ورودی/خروجی ما را بررسی کنید.