جارٍ تحميل الدرس...
في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
نظم التشغيل 2 - المعمل 4
دمج Row وColumn، وExpanded مقابل Flexible، وفصل البيانات عن الواجهة
Row وColumnColumn، ثم ضع عدة أعمدة من هذا النوع داخل RowRow للترتيب الأفقي، وColumn للترتيب الرأسي، وتدمجان لبناء شبكات من العناصرRow
ترتيب أفقي
Column
أيقونة + نص: الرئيسية
Column
أيقونة + نص: بحث
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(children: [Icon(Icons.home), Text('Home')]),
Column(children: [Icon(Icons.search), Text('Search')]),
],
)Widget يعرف مرة واحدة ويقبل معاملات، فيحل محل نسخ ولصق نفس تركيبة العناصر عدة مرات.class NavItem extends StatelessWidget {
final IconData icon;
final String label;
const NavItem({required this.icon, required this.label});
@override
Widget build(BuildContext context) {
return Column(children: [Icon(icon), Text(label)]);
}
}ExpandedExpandedRow أو Column لإجبار عنصر ابن على ملء كل المساحة المتبقية المتاحة.Row(
children: [
Icon(Icons.label),
Expanded(child: Text('Stretches to fill the rest')),
Icon(Icons.arrow_forward),
],
)FlexibleFlexibleflex - يجمع النظام كل قيم flex ويقسم المساحة حسب النسبة.flex تساوي 7 و1 و2 (المجموع 10) تحصل على 70% و10% و20% من المساحة على التواليExpanded، يمكن أن ينتهي عنصر Flexible الابن أصغر من نصيبه إذا لم يكن يحتاج المساحة كاملةالقسم الأول
flex: 7 -> 70%
القسم الثاني
flex: 1 -> 10%
القسم الثالث
flex: 2 -> 20%
Column(
children: [
Flexible(flex: 7, child: Container(color: Colors.blue[100])),
Flexible(flex: 1, child: Container(color: Colors.grey[300])),
Flexible(flex: 2, child: Container(color: Colors.green[100])),
],
)Expanded مقابل Flexible| العنصر | السلوك |
|---|---|
Expanded | يملأ دائما كل المساحة المتبقية (يعادل Flexible مع fit: FlexFit.tight) |
Flexible | يأخذ حتى حصته النسبية فقط؛ يمكن أن يكون العنصر الفرعي أصغر من ذلك |
Flexible(
flex: 7,
child: Image.asset(
'assets/header.jpg',
fit: BoxFit.cover, // Covers the container without distortion
width: double.infinity,
),
)build واحدة يجعلها صعبة القراءة والصيانةالصفحة الرئيسية
دالة build
ImageSection
TitleSection
DescriptionSection
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [ImageSection(), TitleSection(), DescriptionSection()],
),
);
}Product
نموذج بيانات
عنصر الواجهة
يستقبل نسخة منه
الواجهة المعروضة
class Product {
final String name;
final double price;
const Product({required this.name, required this.price});
}Row وColumn لبناء البنية الأساسيةExpanded وFlexible بحيث تتكيف الشاشة عبر الأجهزةColumn داخل Row (أو العكس) يبني تخطيطات شبيهة بالشبكة، بأيقونة + تسميةExpanded كل المساحة المتبقية؛ ويخصص Flexible المساحة تناسبيا ويمكن أن يتقلصbuild واحدة ضخمةMahmoud Abas|المعمل: تخطيطات واجهات متقدمة، إدارة المساحة، وتنظيم الكود