ویرگول
ورودثبت نام
اردوان اسکندری
اردوان اسکندریمینویسم تا پلی بزنم بین دنیای برنامه نویسی و طراحی. مقالات تخصصی کوتاه و نکات مفید روزانه در کانال تلگرام خودم : https://t.me/ardavandesign
اردوان اسکندری
اردوان اسکندری
خواندن ۲ دقیقه·۲ روز پیش

چرا متغیرهای const در فلاتر rebuild میشوند؟

اگر مدتی با 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 است 😉

فلاتربرنامه نویسینرم افزارکامپیوترکدنویسی
۳
۰
اردوان اسکندری
اردوان اسکندری
مینویسم تا پلی بزنم بین دنیای برنامه نویسی و طراحی. مقالات تخصصی کوتاه و نکات مفید روزانه در کانال تلگرام خودم : https://t.me/ardavandesign
شاید از این پست‌ها خوشتان بیاید