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

غالبًا أكثر المشاكل اللي نواجهها مع GridView في Flutter هي طريقة عرض العناصر بحجم المحتوى نفسه أو حجم متغير بحسب حجم المحتوى (height, width).

 


لأنه برغم وجود بعض الخيارات اللي نقدر نتحكم فيها، لازلنا نعاني من ضبط الحجم بدون مشاكل:


▫️ childAspectRatio


ياخذ نسبة width/height ثابتة على كل العناصر


إذا كان العرض أو الارتفاع ضيق → Overflow


إذا كان واسع → مساحات فارغة كبيرة أسفل العنصر


▫️ maxCrossAxisExtent


تعطي لكل عنصر أقصى إرتفاع  ثابت، ويحسب Flutter عدد الأعمدة تلقائيًا


يفيد لما يكون عندك حجم عناصر محدد مسبقًا


لكن ما يحل مشكلة الارتفاع الديناميكي حسب المحتوى


وبالتالي لازلنا ما نقدر نعرض العناصر بحجم ديناميكي يتناسب مع المحتوى الكبير أو الصغير… 😅


طريقتنا في الـ Row/Column

لما يكون عندنا Row أو Column ونحتاج نطبّق حجم أكبر عنصر على بقية العناصر أو توحيد الحجم :


IntrinsicWidth للعرض: ياخذ عرض أكبر عنصر في الـ Column ويطبقه على الجميع


IntrinsicHeight للارتفاع: ياخذ ارتفاع أكبر عنصر في الـ Row ويطبقه على الجميع


☑️ وهذا اللي نحتاجه في الـ Grid:


نقيس في كل صف أكبر ارتفاع ونطبقه على بقية العناصر في ذلك الصف


الحل العملي: flutter_layout_grid

بدل ما نكتب MultiChildRenderObjectWidget معقد، استخدمنا مكتبة قوية تعتمد على CSS Grid Layout عشان نتعامل مع content-sized items بسهولة:

__________________________________________________

Fixed tracks: للأبعاد الثابتة بالبكسل


columnSizes: [FixedTrackSize(100), 1.fr]

__________________________________________________

Flexible tracks: وحدة fr (Fractional Unit) لتوزيع المساحة المتبقية


// fr يعني flex: 1

columnSizes: [1.fr, 1.fr, 1.fr]

__________________________________________________

Content-sized tracks: auto عشان يحسب الحجم بناءً على محتوى العنصر


rowSizes: [auto, auto, auto]

__________________________________________________

في الصورة المرفقة مثال عام عن طريقة الاستخدام، وتقدر تتحكم بخصائص أكثر حسب احتياجك.


وللمكتبه استخدامات قوية خاصة: 

Flutter Web: تقسيم الشاشة بشكل Responsive



لو حابين تتعمقوا أكثر وشوفوا كل التفاصيل:

https://pub.dev/