Row في Jetpack Compose: ما هي، خصائص composable وكيف تعمل

المؤلف: IT Sectr نُشر: 2026-06-28 وقت القراءة: 10 دق

Row هي دالة composable في Jetpack Compose لوضع العناصر الفرعية في صف أفقي. على عكس Column، يقوم Row بترتيب العناصر من اليسار إلى اليمين ويدعم تكوين التخطيط من خلال المعلمات horizontalArrangement و verticalAlignment. وفقًا لـ Google Android Documentation, 2025، يعتبر Row أحد الحاويات الأساسية الثلاث في Compose إلى جانب Column و Box ويستخدم لإنشاء هياكل واجهة أفقية: صفوف الأزرار وحقول الإدخال والأيقونات مع النص.

الملامح الرئيسية

  • Row هي حاوية أفقية في Jetpack Compose تضع العناصر القابلة للتركيب الفرعية في سطر واحد من اليسار إلى اليمين.
  • horizontalArrangement يتحكم في توزيع العناصر أفقيًا: بالتساوي، مع تباعد، أو في نهاية الحاوية.
  • verticalAlignment يقوم بمحاذاة العناصر عموديًا بالنسبة للحاوية: للأعلى أو الوسط أو الأسفل.
  • Modifier.weight يسمح بتوزيع المساحة المتاحة بين عناصر Row بشكل متناسب مع الوزن المحدد.
  • Row فعال لإنشاء صفوف الأزرار وقوائم الأيقونات وحقول الإدخال وأشرطة الأدوات الأفقية في الواجهات المحمولة.

ما هو Row في Jetpack Compose

Row هي دالة composable تضع العناصر الفرعية في تسلسل أفقي. في التسلسل الهرمي لتخطيطات Compose، يحتل Row موقع الحاوية الأساسية إلى جانب Column و Box.

لا يتطلب Row تحديد الأبعاد — فهو يضبط نفسه تلقائيًا وفقًا لمحتواه. عرض Row يساوي مجموع عروض العناصر الفرعية بما في ذلك الحواف، ما لم يتم تحديد Modifier.fillMaxWidth أو حجم ثابت.

يمكن أن تحتوي العناصر الفرعية لـ Row على معدّلاتها الخاصة التي تؤثر على موقعها داخل الحاوية. على سبيل المثال، Modifier.weight يسمح للعناصر بشغل جزء متناسب من المساحة المتاحة.

وفقًا لـ Android Developers Blog, 2024، يقوم Row بمعالجة العناصر الفرعية بالتسلسل، محسوبًا أحجامها بناءً على قواعد القياس في Compose: يتم قياس العناصر بدون weight أولاً، ثم يتم توزيع المساحة المتبقية بين العناصر ذات weight.

صيغة Row والتوقيع الأساسي

يتضمن التوقيع الأساسي لـ Row المعامل modifier و horizontalArrangement و verticalAlignment. يتم تمرير جميع العناصر الفرعية في كتلة لامدا النهائية للمحتوى.

kotlin
@Composable
fun RowExample() {
    Row(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        horizontalArrangement = Arrangement.SpaceEvenly,
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(text = "واحد")
        Text(text = "اثنان")
        Text(text = "ثلاثة")
    }
}

خصائص Row: horizontalArrangement و verticalAlignment

يحدد المعامل horizontalArrangement كيفية توزيع العناصر الفرعية على طول المحور الأفقي داخل Row. تتضمن القيم المتاحة Start و End و Center و SpaceBetween و SpaceAround و SpaceEvenly من فئة Arrangement.

Arrangement.Start يضع العناصر في بداية الحاوية، Arrangement.End — في النهاية، و Arrangement.Center — في المنتصف. تعمل هذه القيم بشكل مشابه لخاصية justify-content في CSS Flexbox.

Arrangement.SpaceBetween يوزع العناصر بالتساوي، واضعًا العنصر الأول في البداية والأخير في النهاية، والباقي بمسافات متساوية بينهم. وفقًا لـ Material Design Guidelines, 2025، يعتبر SpaceBetween مثاليًا لأشرطة الأدوات وصفوف التنقل.

المعامل verticalAlignment يقوم بمحاذاة العناصر عموديًا. تتضمن القيم المتاحة Alignment.Top و Alignment.CenterVertically و Alignment.Bottom. هذه الخاصية مفيدة عندما تكون عناصر Row ذات ارتفاعات مختلفة — على سبيل المثال، أيقونة بجانب نص متعدد الأسطر.

جدول قيم Arrangement

القيمةالوصفالاستخدام
Startالعناصر مدفوعة إلى بداية Rowصفوف محاذاة لليسار
Centerالعناصر في وسط الحاويةقوائم أفقية، عناوين
SpaceBetweenبالتساوي مع الأول في البداية والأخير في النهايةأشرطة أدوات، تنقل
SpaceEvenlyتباعد متساوٍ بين العناصر وعند الحوافصفوف أزرار، شبكات موحدة
SpaceAroundتباعد متساوٍ بين العناصر، نصف تباعد عند الحوافدوّارات، معارض أيقونات

توزيع المساحة مع Modifier.weight

Modifier.weight هو معدّل متاح فقط داخل Row و Column يقوم بتوزيع المساحة المتاحة بين العناصر الفرعية بشكل متناسب مع القيمة المحددة. إذا كان وزن العنصر 1.0f وآخر 2.0f، فسيشغل العنصر الثاني ضعف المساحة.

العناصر بدون weight تشغل المساحة اللازمة لمحتواها. يتم توزيع المساحة المتبقية بين العناصر ذات weight بشكل متناسب مع أوزانها. هذا السلوك مشابه لخاصية flex-grow في CSS Flexbox.

وفقًا لـ Android Developer Documentation, 2025، يعمل weight فقط داخل Row و Column و BoxWithConstraints. عند استخدام weight في Row، يتم قياس جميع العناصر الفرعية في مرورين: أولاً العناصر بدون weight، ثم العناصر ذات weight.

kotlin
@Composable
fun WeightExample() {
    Row(
        modifier = Modifier.fillMaxWidth(),
        horizontalArrangement = Arrangement.Start
    ) {
        Text(
            text = "يسار",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "يمين")
    }
}

أمثلة على الكود مع Row

المثال الأول يوضح Row مع أيقونة ونص — سيناريو نموذجي لقائمة جهات الاتصال أو الإعدادات. يتم تغليف Icon و Text في Row مع verticalAlignment في المنتصف.

kotlin
@Composable
fun IconWithText() {
    Row(
        verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier.padding(8.dp)
    ) {
        Icon(
            imageVector = Icons.Default.Favorite,
            contentDescription = "Favorite"
        )
        Spacer(modifier = Modifier.width(8.dp))
        Text(text = "إضافة إلى المفضلة")
    }
}

المثال الثاني يظهر Row مع أزرار وتوزيع متساوٍ. SpaceEvenly يضمن تباعدًا متساويًا بين جميع الأزرار وحواف الحاوية.

kotlin
@Composable
fun ButtonRow() {
    Row(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        horizontalArrangement = Arrangement.SpaceEvenly
    ) {
        Button(onClick = {}) { Text("إلغاء") }
        Button(onClick = {}) { Text("حفظ") }
    }
}

المثال الثالث — Row داخل Card لعرض تقييم. يسمح Row المتداخل مع Modifier.weight لنجمة التقييم والقيمة الرقمية بشغل مساحة ثابتة.

kotlin
@Composable
fun RatingRow(rating: Float) {
    Row(
        verticalAlignment = Alignment.CenterVertically
    ) {
        Text(
            text = "التقييم:",
            modifier = Modifier.weight(1.0f)
        )
        Text(text = "$rating / 5.0")
    }
}

ميزات Row في التخطيط التكيفي

Row يتطلب التحكم في العرض في التخطيط التكيفي. إذا تجاوز محتوى Row عرض الشاشة المتاح، فقد تفيض العناصر على حدود الحاوية. لمنع ذلك، استخدم Modifier.horizontalScroll أو انتقل إلى Column.

عند دمج Row مع Modifier.weight، من المهم تعيين fillMaxWidth لـ Row الأصلي — وإلا فإن weight سيوزع مساحة غير موجودة. وفقًا لـ Material Design Guidelines, 2025، يعتبر Row مع weight بدون fillMaxWidth تكوينًا غير صالح.

للحصول على واجهات تكيفية، يُنصح بدمج Row مع Box أو استخدام Arrangement.SpaceBetween للتوزيع التلقائي للعناصر عبر أحجام الشاشات المختلفة. يوفر هذا المرونة بدون استعلامات وسائط.

  • Modifier.horizontalScroll — يضيف التمرير عند تجاوز Row
  • Modifier.weight — يوزع المساحة بشكل متناسب
  • Arrangement.SpaceBetween — توزيع تكيفي مع تثبيت عند الحواف

الأسئلة الشائعة

كيف يختلف Row عن Column في Jetpack Compose؟

Row يضع العناصر أفقيًا (من اليسار إلى اليمين)، بينما Column يضعها عموديًا (من الأعلى إلى الأسفل). Row يستبدل LinearLayout بالتوجيه الأفقي من نهج View القديم، و Column يستبدل LinearLayout العمودي.

كيفية جعل Row قابلاً للتمرير؟

أضف المعدّل Modifier.horizontalScroll إلى Row. للقوائم الكبيرة مع التحميل البطيء، استخدم LazyRow — فهو يعرض العناصر المرئية فقط ويعيد تدويرها أثناء التمرير.

هل يمكن تداخل Row داخل Row آخر؟

نعم، يمكن تداخل Row داخل Row أو Column أو Box آخر. عند التداخل، ضع في اعتبارك أن Row الداخلي سيحصل على عرضه من الحاوية الأم، وإذا لزم الأمر، قم بتعيين fillMaxWidth لكل مستوى.

ماذا يفعل Modifier.weight في Row؟

Modifier.weight يوزع المساحة المتبقية في Row بين العناصر الفرعية بشكل متناسب مع الوزن المحدد. عنصر بوزن 2.0f سيكون ضعف عرض عنصر بوزن 1.0f. يعمل الوزن فقط داخل Row و Column.

كيفية محاذاة عناصر Row في المنتصف عموديًا؟

استخدم المعامل verticalAlignment = Alignment.CenterVertically عند إنشاء Row. هذا سيقوم بمحاذاة جميع العناصر الفرعية على طول المحور العمودي بغض النظر عن ارتفاعها.

الخلاصة

  • Row هي حاوية أفقية في Compose لوضع العناصر في صف من اليسار إلى اليمين مع ترتيب ومحاذاة قابلة للتخصيص.
  • horizontalArrangement يتحكم في توزيع العناصر أفقيًا: Start، Center، End، SpaceBetween، SpaceEvenly و SpaceAround.
  • verticalAlignment يقوم بمحاذاة العناصر عموديًا عبر Alignment.Top أو CenterVertically أو Bottom.
  • Modifier.weight يوزع المساحة الحرة بين العناصر بشكل متناسب مع الوزن المحدد، مشابهًا لـ flex-grow في CSS.
  • Row يدعم التداخل والتمرير عبر Modifier.horizontalScroll والعمل مع حاويات Compose الأخرى.
  • في التخطيط التكيفي، من المهم تعيين Modifier.fillMaxWidth لـ Row مع weight، وإلا لن توزع العناصر المساحة بشكل صحيح.
  • للقوائم الأفقية التي تحتوي على العديد من العناصر، استخدم LazyRow بدلاً من Row للحصول على أداء أمثل.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا