
اگر مدتی با Flutter کار کرده باشید، حتماً این توصیهٔ افسانهای را شنیدهاید:
«فقط
constکن، دیگه rebuild نمیشه.»
این جمله معمولاً با همان اعتمادبهنفس «گوشی رو خاموش روشن کردی؟» گفته میشود.
و مدتی هم باورش میکنید. همهجا const میریزید، احساس حرفهای بودن میکنید، بعد DevTools را باز میکنید و میبینید ویجتها هنوز rebuild میشوند.
اینجاست که باید یک نکتهٔ مهم را روشن کنم:
در فلاتر، rebuild دشمن نیست.
rebuild فقط یعنی متد build() دوباره اجرا شده ؛ نه بیشتر.
Flutter دائماً این کار را انجام میدهد و در آن فوقالعاده بهینه است.
چیزی که واقعاً به عملکرد ضربه میزند، کارهای بعد از rebuild است:
layout، paint و compositing — همان چیزهایی که اگر موبایل فن داشت، باعث روشن شدنش میشد!
به همین دلیل است که همیشه میشنوید:
«منطق سنگین رو داخل build ننویس»
چون build() ممکن است خیلی بیشتر از چیزی که فکر میکنید اجرا شود.
در نگاه اول، این دو جفت کد کاملاً شبیه هم به نظر میرسند:
Text('Hello'); final b = Text('Hello'); print(identical(a, b)); // false const c = Text('Hello'); const d = Text('Hello'); print(identical(c, d)); // true
در حالت final، هر بار یک شیء جدید در runtime ساخته میشود.
ولی در حالت const، ویجت در زمان کامپایل ساخته و توسط Dart cache میشود،
پس هر جا تکرار شود، همان instance استفاده میشود.
حالا میرسیم به مثال واقعیتر ؛ همان جایی که توسعهدهندهها میگویند:
«ولی این که
constهست، چرا هنوز rebuild میشه؟»
وقتی روی دکمه کلیک میکنید و setState صدا زده میشود:
بله، کل والد rebuild میشود
این رفتار کاملاً طبیعی و مورد انتظار است
اما Flutter چه کار میکند؟
ویجت داینامیک (Text('Count: $count')) را بهروزرسانی میکند
ویجت const را میشناسد، میگوید «این همونه» وlayout و paint آن را دوباره انجام نمیدهد
پس:
ویجت rebuild شد،
اما کار سنگین رندر انجام نشد.
دفعهٔ بعد که کسی گفت:
«فقط
constکن، rebuild نمیشه»
یادتان باشد:
این حرف نصفش درست است
const جلوی rebuild را نمیگیرد
const جلوی هدر رفتن منابع را میگیرد
و این دقیقاً همان بهینهسازی هوشمند Flutter است 😉