Flutter LayoutsFlutter Layouts

عندما تبدأ رحلتك مع Flutter، ستكتشف أن التخطيطات (Layouts) هي العمود الفقري لأي واجهة مستخدم. كل زر، نص، صورة أو حتى مساحة فارغة تراها داخل تطبيق Flutter يتم تنظيمها من خلال الـ Layout widgets.
الفكرة الأساسية أن Flutter لا يعتمد على “ملفات تصميم” منفصلة مثل XML في أندرويد، بل كل شيء هو widget، حتى التخطيطات نفسها. وهذا ما يجعل الكود أكثر وضوحًا ومرونة.

في هذا المقال، سنغوص في عالم التخطيطات ونتعرف على جميع أنواعها كما وردت في الدليل الرسمي. سنقسمها إلى ثلاث مجموعات:

  1. تخطيطات لطفل واحد (Single-child layout widgets).
  2. تخطيطات لعدة أطفال (Multi-child layout widgets).
  3. تخطيطات Sliver للقوائم المتدفقة.

أولًا: تخطيطات طفل واحد (Single-child layout widgets)

هذه الفئة مخصصة لوضع عنصر واحد فقط والتحكم في حجمه أو مكانه.

1. Align

يُستخدم لمحاذاة عنصر داخل مساحة أكبر.

Align(
  alignment: Alignment.bottomRight,
  child: Text("أنا في الأسفل يمين 👇"),
)

2. AspectRatio

يحافظ على نسبة العرض إلى الارتفاع.

AspectRatio(
  aspectRatio: 16 / 9,
  child: Container(color: Colors.blue),
)

3. Baseline

يرتب النصوص حسب خط الأساس.

Row(
  children: [
    Baseline(
      baseline: 40,
      baselineType: TextBaseline.alphabetic,
      child: Text("Flutter", style: TextStyle(fontSize: 30)),
    ),
    Text("Layout", style: TextStyle(fontSize: 16)),
  ],
)

4. Center

يبسط الأمور ويضع العنصر في الوسط.

Center(child: Text("في المنتصف تمامًا"))

5. ConstrainedBox

يفرض قيودًا على الحجم.

ConstrainedBox(
  constraints: BoxConstraints(maxWidth: 200, minHeight: 100),
  child: Container(color: Colors.green),
)

6. Container

الأداة الأشهر لأنها متعددة الاستخدامات.

Container(
  padding: EdgeInsets.all(16),
  margin: EdgeInsets.all(8),
  color: Colors.orange,
  child: Text("أنا داخل Container"),
)

7. CustomSingleChildLayout

للتخطيطات المخصصة باستخدام delegate. (نادر الاستخدام للمبتدئين)

8. Expanded

يمد العنصر ليملأ المساحة داخل Row/Column.

Row(
  children: [
    Expanded(child: Container(color: Colors.red)),
    Expanded(child: Container(color: Colors.blue)),
  ],
)

9. FittedBox

يضبط حجم الطفل ليناسب الحاوية.

FittedBox(
  child: Text("تكبير/تصغير تلقائي"),
)

10. FractionallySizedBox

يحدد الحجم كنسبة من المساحة المتاحة.

FractionallySizedBox(
  widthFactor: 0.5,
  child: Container(color: Colors.purple, height: 50),
)

11. IntrinsicHeight / 12. IntrinsicWidth

تجعل العناصر تعتمد على حجمها الطبيعي. (مفيدة لكن قد تؤثر على الأداء)

13. LimitedBox

يضع حدًا في حال لم توجد قيود من الوالد.

14. Offstage

يخفي العنصر لكنه يبقى موجودًا في الشجرة.

15. OverflowBox

يسمح للطفل بالتجاوز عن حجم الوالد.

16. Padding

لإضافة مسافات حول العناصر.

Padding(
  padding: EdgeInsets.all(20),
  child: Text("نص مع padding"),
)

17. SizedBox

لحجم ثابت أو لإضافة مسافة فارغة.

SizedBox(width: 50, height: 50)

18. SizedOverflowBox

مثل SizedBox لكن يسمح بالتجاوز.

19. Transform

لتحويلات مثل التدوير والتحريك.

Transform.rotate(
  angle: 0.2,
  child: Text("دوران بسيط"),
)

ثانيًا: تخطيطات متعددة الأطفال (Multi-child layout widgets)

هذه المجموعة تنظم أكثر من عنصر معًا.

1. Column

يرتب الأطفال عموديًا.

Column(
  children: [
    Text("العنصر الأول"),
    Text("العنصر الثاني"),
  ],
)

2. Row

يرتب الأطفال أفقيًا.

Row(
  mainAxisAlignment: MainAxisAlignment.spaceAround,
  children: [
    Icon(Icons.home),
    Icon(Icons.star),
    Icon(Icons.person),
  ],
)

3. Flex

مرن أكثر من Row/Column.

4. Flow

لتخطيطات معقدة باستخدام delegate.

5. GridView

شبكة قابلة للتمرير.

GridView.count(
  crossAxisCount: 3,
  children: List.generate(9, (index) {
    return Container(color: Colors.blue[100 * (index % 9)]);
  }),
)

6. IndexedStack

يعرض طفل واحد فقط حسب الفهرس.

7. LayoutBuilder

يبني التخطيط حسب قيود الشاشة (مفيد للـ responsive).

8. ListView

قائمة قابلة للتمرير.

ListView(
  children: List.generate(10, (i) => Text("عنصر رقم $i")),
)

9. Stack

لعرض العناصر فوق بعضها.

Stack(
  children: [
    Container(color: Colors.blue, width: 200, height: 200),
    Positioned(top: 20, left: 20, child: Text("نص فوق الحاوية")),
  ],
)

10. Table

ينظم البيانات في جدول.

11. Wrap

يلف العناصر إذا لم تتسع في صف واحد.

Wrap(
  spacing: 8,
  children: List.generate(6, (i) => Chip(label: Text("Tag $i"))),
)

12. CustomMultiChildLayout

للتخطيطات المعقدة باستخدام delegate.


ثالثًا: Widgets الـ Sliver

تستخدم مع CustomScrollView لإنشاء قوائم متدفقة ديناميكية.

1. SliverAppBar

شريط علوي يتفاعل مع التمرير.

2. SliverFixedExtentList

قائمة بعناصر بارتفاع ثابت.

3. SliverGrid

شبكة داخل CustomScrollView.

4. SliverList

قائمة ديناميكية.

5. SliverPadding

يضيف فراغات داخل الـ sliver.

6. SliverToBoxAdapter

يسمح بدمج widgets عادية داخل التمرير المخصص.


الخاتمة

التخطيطات هي الأساس في Flutter، وفهمها يعطيك قوة هائلة لبناء واجهات متجاوبة وسلسة.
ابدأ بالأبسط مثل Row وColumn، ثم جرّب الأدوات المتقدمة مثل Stack وSliverAppBar لتصميم تطبيقات احترافية.

By احمد علي

مطور تطبيقات هواتف ذكية باستخدام Flutter، وصانع محتوى تقني يكتب عن الذكاء الاصطناعي والبرمجة وتطورات التكنولوجيا الحديثة. أسعى لتبسيط الأفكار المعقدة ومشاركة خبرتي مع المهتمين بالمجال.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *