🧱 ما هي Column؟
Columnهي ويدجت (عنصر واجهة مستخدم) في Flutter تقوم بترتيب مجموعة من الودجات (widgets) عموديًا (من الأعلى للأسفل أو العكس حسب الاتجاه).
Column(
children: [
Text('مرحبا'),
Icon(Icons.star),
],
)Dart🧩 متى نستخدم Column؟
- لعرض عناصر فوق بعضها مثل:
- نموذج تسجيل دخول (Login Form)
- عناصر الشاشة في صفحة تفاصيل
- مزيج من أزرار ونصوص وصور بشكل رأسي
📌 أهم خصائص Column
1. children
قائمة العناصر التي توضع داخل العمود.
Column(
children: [
Text('العنصر الأول'),
Text('العنصر الثاني'),
],
)Dart2. mainAxisAlignment
تتحكم في توزيع العناصر على المحور العمودي (الرأسي)
| القيمة | التأثير |
|---|---|
start | العناصر تبدأ من الأعلى (افتراضي) |
end | العناصر تبدأ من الأسفل |
center | العناصر في الوسط |
spaceBetween | فراغ متساوٍ بين العناصر فقط |
spaceAround | فراغ متساوٍ حول كل عنصر |
spaceEvenly | فراغات متساوية بين وحول كل العناصر |
🧠 في Column، Main Axis = المحور العمودي
3. crossAxisAlignment
تتحكم في محاذاة العناصر على المحور الأفقي
| القيمة | التأثير |
|---|---|
start | محاذاة إلى اليسار (أو اليمين في RTL) |
end | محاذاة إلى الجهة الأخرى |
center | توسيط أفقي |
stretch | تمدد العرض ليملأ كامل المحور الأفقي |
baseline | المحاذاة حسب خط الأساس للنص (يتطلب textBaseline) |
🧠 Cross Axis في Column هو المحور الأفقي (العرض)
4. mainAxisSize
هل تأخذ
Columnكل الارتفاع المتاح، أم فقط على حسب محتواها؟
| القيمة | التأثير |
|---|---|
MainAxisSize.max | يملأ كامل الشاشة عموديًا (افتراضي) |
MainAxisSize.min | يأخذ فقط المساحة اللازمة للعناصر |
5. textDirection
يؤثر على اتجاه المحاذاة الأفقي في حال استخدام
startوend
| القيمة | التأثير |
|---|---|
TextDirection.ltr | من اليسار لليمين |
TextDirection.rtl | من اليمين لليسار |
6. verticalDirection
يحدد اتجاه عرض العناصر عموديًا
| القيمة | التأثير |
|---|---|
down | من الأعلى للأسفل (افتراضي) |
up | من الأسفل للأعلى |
7. clipBehavior
قص المحتوى الزائد إذا خرج عن حدود العمود
| القيمة | التأثير |
|---|---|
Clip.none | لا يتم القصّ |
Clip.hardEdge، antiAlias… | يتم القص بحسب الطريقة |
🔁 مثال شامل:
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('أعلى'),
Icon(Icons.star),
ElevatedButton(onPressed: () {}, child: Text('زر')),
],
)Dart💡 ملاحظات مهمة:
- مثل
Row، لا تدعمColumnالتمرير تلقائيًا.
إذا زاد المحتوى عن الشاشة، يجب استخدام:
SingleChildScrollView(
child: Column(
children: [...],
),
)Dart🔁 الفرق بين Expanded و Flexible داخل Column
✅ Expanded
تملأ كل المساحة المتبقية عموديًا:
Column(
children: [
Text('أعلى'),
Expanded(child: Container(color: Colors.blue)),
],
)Dart✅ Flexible
يستخدم جزء من المساحة بشكل مرن، دون إجبار
Column(
children: [
Flexible(child: Container(color: Colors.green)),
Text('أسفل'),
],
)Dart📦 مقارنة سريعة بين Row و Column
| الميزة | Row | Column |
|---|---|---|
| ترتيب أفقي | ✔️ | ❌ |
| ترتيب عمودي | ❌ | ✔️ |
| mainAxis = | أفقي | عمودي |
| crossAxis = | عمودي | أفقي |
| Scroll مطلوب عند overflow | ✔️ | ✔️ |
🛠️ مثال تطبيقي واقعي
SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'تسجيل الدخول',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 20),
TextField(decoration: InputDecoration(labelText: 'البريد')),
SizedBox(height: 10),
TextField(obscureText: true, decoration: InputDecoration(labelText: 'كلمة المرور')),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {},
child: Text('تسجيل الدخول'),
),
],
),
),
)Dart✅ الخلاصة
| الخاصية | Column |
|---|---|
| ترتيب عمودي للعناصر | ✔️ |
| يدعم المحاذاة الأفقية | ✔️ |
التمدد ممكن باستخدام Expanded و Flexible | ✔️ |
| لا يلف تلقائيًا عند الزيادة | ❌ |
يجب لفّه بـ ScrollView أحيانًا | ✔️ |