بحث باسم الموضوع المطلوب

من أكبر الأخطاء اللي تأثر على الأداء في مشاريع Flutter:



لما تعتمد Widget-Method (دالة ترجع ويدجت) بدل Widget-Class (كلاس يورث من StatefulWidget/StatelessWidget)، بتصير عندك مشاكل أداء للأسباب التاليه:


1️⃣ ما تستخدم const


الدوال ما تقدر تحط const قبل إنشاء الودجت، فيصير كل مرة rebuild حتى لو الودجت ثابتة أو الـ state ما تغيّرت.


بالمقابل، لما تكتب كلاس وتستخدم const MyWidget()، Flutter يخزّنها في الـ Element tree وما يعيد بنائها إلا لو تغيّرت فعلاً.


2️⃣ تمرير أو استخدام الـ BuildContext داخل الدالة


لما تعدي الـ context من دالة لدالة، ومع تزايد الـ Widget Tree، ممكن تواجه أخطاء مثل:


Bad state management: context.read() أو context.watch() يطلع لك null أو “dependOnInheritedWidgetOfExactType” راجع null.


Dialogs: showDialog(context: ctx) 

ممكن يرمي error إن الـ context ما عاد mounted لو المستخدم نقر زر رجوع بعد ما يفتح الديالوج.


الحل: اكتب Widget-Class مع const



 ❌ طريقة Method Widget (تخليك ما تقدر تستخدم const)

Widget myButton(BuildContext context) {

  return ElevatedButton(

    onPressed: () => context.read<MyBloc>().add(DoSomething()),

    child: Text('اضغط'),

  );

}


 ✅ طريقة Class Widget + const

class MyButton extends StatelessWidget {

  const MyButton({Key? key}) : super(key: key);


  @override

  Widget build(BuildContext context) {

    return ElevatedButton(

      onPressed: () => context.read<MyBloc>().add(DoSomething()),

      child: const Text('اضغط'),

    );

  }

}

الميزة:


تقدر تستخدم const MyButton() وين ما تريده → يقلّل من rebuilds الغير ضرورية.


الـ BuildContext متعلق بالعنصر نفسه (element) وما ينشال من غير قصد.


الخلاصة :

- اعتمد على Classes بدل Functions للWidgets حتى تستفيد من const.


- خلي الدوال البسيطة widgets صغيرة جدًا، مثل الDivider لو بتعيد إستخدامه


-  تجنب تمرير الـ context لبعيد: كل ما كان context قريب من مكان الاستخدام، قلت الأخطاء.