Row

🧱 ما هي Row في Flutter؟

  • Row هي ويدجت تُستخدم لترتيب العناصر (Widgets) أفقيًا بجانب بعضها البعض (من اليسار إلى اليمين أو من اليمين إلى اليسار بحسب اتجاه اللغة).
Row(
  children: [
    Icon(Icons.star),
    Text('نجمة'),
  ],
)
Dart
🧩 متى تستخدم Row؟

تُستخدم Row عندما تريد:

  • ترتيب عدة ويدجت في صف أفقي واحد.
  • وضع أزرار أو أي عناصر جنبًا إلى جنب.
  • بناء واجهات بسيطة مثل: شريط أدوات، قائمة أفقية، أو عرض بيانات بشكل أفقي.
📌 الخصائص الأساسية في Row
1. children

القائمة التي تحتوي على الودجات التي سيتم عرضها أفقيًا.

Row(
  children: [
    Icon(Icons.home),
    Text('الصفحة الرئيسية'),
  ],
)
Dart
2. mainAxisAlignment

تتحكم في توزيع العناصر على المحور الأفقي (Main Axis).

القيمةالتأثير
MainAxisAlignment.startمحاذاة من البداية (اليسار أو اليمين حسب اللغة)
MainAxisAlignment.endمحاذاة من النهاية
MainAxisAlignment.centerتوسيط العناصر
MainAxisAlignment.spaceBetweenتوزيع العناصر مع ترك فراغات متساوية بين العناصر فقط
MainAxisAlignment.spaceAroundتوزيع العناصر مع ترك فراغات بين العناصر وحولها
MainAxisAlignment.spaceEvenlyتوزيع العناصر مع فراغات متساوية تمامًا

🧠 المحور الأفقي = Row = Main Axis

3. crossAxisAlignment

تتحكم في محاذاة العناصر على المحور العمودي (Cross Axis).

القيمةالتأثير
CrossAxisAlignment.startمحاذاة العناصر إلى الأعلى
CrossAxisAlignment.endمحاذاة العناصر إلى الأسفل
CrossAxisAlignment.centerتوسيط العناصر عموديًا
CrossAxisAlignment.stretchتمديد العناصر لملء الارتفاع
CrossAxisAlignment.baselineمحاذاة بناءً على خط الأساس للنص (يحتاج textBaseline)

🧠 Cross Axis في Row هو المحور العمودي (الارتفاع).

4. mainAxisSize

تحدد هل تأخذ Row كل عرض الشاشة أو فقط على قدر محتواها.

القيمةالتأثير
MainAxisSize.maxيأخذ كل العرض المتاح (افتراضي)
MainAxisSize.minيأخذ فقط عرض العناصر بداخله
Row(
  mainAxisSize: MainAxisSize.min,
  children: [
    Icon(Icons.star),
    Text('محدود'),
  ],
)
Dart
5. textDirection

اتجاه عرض العناصر (LTR أو RTL)

القيمةالتأثير
TextDirection.ltrمن اليسار لليمين
TextDirection.rtlمن اليمين لليسار
6. verticalDirection

يحدد ترتيب العناصر العمودي (متى نستخدم CrossAxisAlignment).

القيمةالتأثير
VerticalDirection.downمن الأعلى للأسفل (افتراضي)
VerticalDirection.upمن الأسفل للأعلى
7. clipBehavior

إذا تجاوزت الودجات حدود Row، هل يتم قصّها أم لا؟

القيمةالتأثير
Clip.noneلا يتم القصّ (افتراضي)
Clip.hardEdge, antiAliasيتم القصّ بأنماط مختلفة
🎯 مثال عملي شامل:
Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  crossAxisAlignment: CrossAxisAlignment.center,
  mainAxisSize: MainAxisSize.max,
  children: [
    Icon(Icons.home, size: 32),
    Text(
      'الرئيسية',
      style: TextStyle(fontSize: 20),
    ),
    Icon(Icons.settings, size: 32),
  ],
)
Dart
💡 ملاحظات مهمة:
  • Row لا تقوم بالتمرير تلقائيًا إذا زادت العناصر عن عرض الشاشة. لحل هذا:
SingleChildScrollView(
  scrollDirection: Axis.horizontal,
  child: Row(
    children: [...],
  ),
)
Dart
  • يجب أن تكون كل العناصر داخل Row بويدجت يمكنها أن تعمل داخل صف أفقي. إذا أردت عنصر يأخذ عرضًا أكبر، استخدم Expanded أو Flexible.
🔁 الفرق بين Expanded و Flexible (داخل Row)
Expanded

يملأ المساحة المتاحة الباقية.

Row(
  children: [
    Expanded(child: Text('هذا يأخذ كل المساحة الباقية')),
    Icon(Icons.arrow_forward),
  ],
)
Dart
Flexible

يسمح بتعديل المساحة، لكن لا يُجبر العنصر على الامتداد الكامل.

Row(
  children: [
    Flexible(child: Text('هذا مرن')),
    Icon(Icons.arrow_forward),
  ],
)
Dart
🧱 مقارنة مختصرة مع Column
العنصرRowColumn
المحور الأساسيأفقيعمودي
mainAxisAlignmentيتحكم في العرضيتحكم في الارتفاع
crossAxisAlignmentيتحكم في الارتفاعيتحكم في العرض
✅ خلاصة
النقطةRow
ترتيب أفقي للعناصر✔️
يدعم المحاذاة الرأسية✔️ عبر crossAxisAlignment
لا يلف تلقائيًا❌ (يحتاج Scroll أو Wrap)
يستخدم كثيرًا في التصميمات البسيطة والاحترافية✔️