طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 251 · برمجة الأجهزة الذكية
الدرس 3 · الوحدة 2: تطوير واجهات المستخدم للأجهزة الذكية

التخطيط بـ Flexbox في الأجهزة الذكية

ترتيب الواجهة على شاشات الهواتف بـ Flexbox. ⏱ نحو 35 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تعرف أن كل تخطيطٍ في RN هو Flexbox، واتجاهه الافتراضي عموديّ.
  • تضبط الاتجاه والتوزيع والمحاذاة.
  • توزّع المساحة نسبيًّا بـ flex لتصميمٍ متجاوب.

١كل تخطيطٍ Flexbox

في React Native، كل View صندوق Flexbox — لا شبكة CSS ولا float. تتحكّم في الترتيب بثلاث خصائص رئيسة. وأهم فرقٍ عن الويب:

الخاصيةتتحكّم فيقيَم شائعة
flexDirectionاتجاه المحور الرئيسcolumn (افتراضي) · row
justifyContentالتوزيع على المحور الرئيسflex-start · center · space-between
alignItemsالمحاذاة على المحور المتعامدstretch · center · flex-start

٢الاتجاه: عمود أم صف

import { View, Text, StyleSheet } from 'react-native'; function Box({ n }) {  return <Text style={styles.box}>{n}</Text>;} export default function App() {  return (    <View style={{ padding: 12 }}>      <Text style={styles.h}>row (صفّ):</Text>      <View style={{ flexDirection: 'row', gap: 8 }}>        <Box n="1" /><Box n="2" /><Box n="3" />      </View>      <Text style={styles.h}>column (عمود — الافتراضي):</Text>      <View style={{ gap: 8 }}>        <Box n="1" /><Box n="2" /><Box n="3" />      </View>    </View>  );} const styles = StyleSheet.create({  h: { fontWeight: 'bold', marginTop: 10, marginBottom: 4 },  box: { backgroundColor: '#E8820C', color: 'white', padding: 12, borderRadius: 8, textAlign: 'center', minWidth: 40 },});

٣التوزيع والمحاذاة

justifyContent يوزّع على المحور الرئيس، وalignItems يحاذي على المتعامد. مفيدةٌ لشريطٍ علويّ: عنوانٌ ناحية وأيقونةٌ ناحية:

import { View, Text, StyleSheet } from 'react-native'; export default function App() {  return (    <View style={styles.bar}>      <Text style={styles.title}>الرئيسية</Text>      <Text style={styles.icon}>☰</Text>    </View>  );} const styles = StyleSheet.create({  bar: {    flexDirection: 'row',    justifyContent: 'space-between',    alignItems: 'center',    backgroundColor: '#E8820C',    padding: 14,  },  title: { color: 'white', fontSize: 18, fontWeight: 'bold' },  icon: { color: 'white', fontSize: 22 },});

٤flex: توزيع المساحة

الخاصية flex توزّع المساحة الفارغة بين العناصر نسبيًّا. flex: 1 لكليهما = نصفان متساويان؛ قيمٌ مختلفة = نِسبٌ مختلفة:

import { View, Text, StyleSheet } from 'react-native'; export default function App() {  return (    <View style={{ flexDirection: 'row', height: 100, padding: 8, gap: 6 }}>      <View style={[styles.col, { flex: 2, backgroundColor: '#E8820C' }]}>        <Text style={styles.t}>flex: 2</Text>      </View>      <View style={[styles.col, { flex: 1, backgroundColor: '#2E7D32' }]}>        <Text style={styles.t}>flex: 1</Text>      </View>    </View>  );} const styles = StyleSheet.create({  col: { justifyContent: 'center', alignItems: 'center', borderRadius: 8 },  t: { color: 'white', fontWeight: 'bold' },});

اليسار يأخذ ضعف اليمين. flex ثورةٌ للتصميم المتجاوب: لا أبعاد ثابتة، بل نِسب.

توقّع وتحقّق

الاتجاه الافتراضي لـ View في React Native:

بخلاف الويب.

أي خاصية توزّع العناصر على المحور الرئيس؟

لجعل عنصرٍ يأخذ كل المساحة المتاحة:

لوضع عنوانٍ ناحية وأيقونةٍ ناحية في صفّ:

الخلاصة

تحدٍّ برمجي: شريط علويّ متوازن

سهل

اصنع شريطًا علويًّا: عنوانٌ على جهة وزرُّ إعداداتٍ على الجهة الأخرى.

المطلوب:
  • View بـ flexDirection: 'row' وjustifyContent: 'space-between' وalignItems: 'center'.
  • <Text testID="brand"> نصّه «تطبيقي».
  • <Text testID="gear"> نصّه «⚙».
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء في Console
  • العلامة في testID=brand
  • الزرّ في testID=gear
  • استُخدم flexDirection: row
  • استُخدم space-between

💡 تلميح 1
العنصران داخل View واحدة بخصائص الصفّ والتوزيع.
💡 تلميح 2
space-between يدفع الأول للبداية والأخير للنهاية.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

import { View, Text, StyleSheet } from 'react-native'; export default function App() {  return (    <View style={styles.bar}>      <Text testID="brand" style={styles.t}>تطبيقي</Text>      <Text testID="gear" style={styles.t}>⚙</Text>    </View>  );} const styles = StyleSheet.create({  bar: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#E8820C', padding: 14 },  t: { color: 'white', fontSize: 18, fontWeight: 'bold' },});
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس