Scaffold هي دالة composable في Jetpack Compose تنفذ الهيكل الأساسي للشاشة وفقًا لمواصفات Material Design. توفر Scaffold فتحات لـ TopAppBar و BottomBar و FloatingActionButton و Drawer و Snackbar. وفقًا لـ Google Android Documentation, 2025، فإن Scaffold عنصر إلزامي لمعظم الشاشات في تطبيقات Compose، حيث يدير الهوامش لمكونات نظام Material Design.
النقاط الرئيسية
Scaffold هي دالة composable تنفذ هيكل الشاشة وفقًا لمواصفات Material Design. Scaffold ليست حاوية بالمعنى التقليدي — بل هي مدير تخطيط ينسق وضع عدة مكونات قياسية من Material على الشاشة.
تدير Scaffold الهوامش لـ TopAppBar و BottomBar و FloatingActionButton، بالإضافة إلى عناصر النظام — شريط الحالة وشريط التنقل. يضمن ذلك عدم تداخل المحتوى مع عناصر النظام والامتثال لإرشادات Material Design.
وفقًا لـ Material Design Guidelines, 2025، يجب أن تكون Scaffold العنصر الجذر لكل شاشة تطبيق. تحل محل CoordinatorLayout القديم من نظام View وتوفر واجهة برمجة تطبيقات أبسط وتصريحية لبناء تخطيطات الشاشة.
Scaffold تقبل المعاملات modifier و scaffoldState و topBar و bottomBar و floatingActionButton و drawerContent و snackbarHost و content. يستقبل معامل content PaddingValues — الهوامش التي يجب أن يأخذها المحتوى الرئيسي في الاعتبار.
@Composable
fun BasicScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("الصفحة الرئيسية") }
)
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, contentDescription = "Add")
}
}
) { innerPadding ->
Column(
modifier = Modifier.padding(innerPadding)
) {
Text("المحتوى الرئيسي")
}
}
}
topBar هي الفتحة لوضع شريط التطبيق العلوي، عادةً TopAppBar أو LargeTopAppBar. تضيف Scaffold تلقائيًا هوامش إلى innerPadding للمحتوى حتى لا يتداخل مع topBar. يمكن أن يحتوي TopAppBar على عنوان وأيقونة تنقل وإجراءات.
bottomBar هي الفتحة لشريط التنقل السفلي. تدعم BottomNavigation و BottomAppBar أو NavigationBar. تراعي Scaffold ارتفاع bottomBar عند حساب innerPadding للمحتوى. وفقًا لـ Material Design Guidelines, 2025، يجب استخدام bottomBar في الشاشات التي تحتوي على 3–5 نقاط تنقل.
floatingActionButton هي الفتحة لزر الإجراء العائم. تضع Scaffold تلقائيًا FAB وفقًا لمواصفات Material Design — في الزاوية اليمنى السفلية بهامش صحيح. floatingActionButtonPosition يسمح بنقل FAB إلى منتصف الحافة السفلية للشاشة.
في هذا المثال، تستخدم Scaffold جميع الفتحات الرئيسية: TopAppBar بعنوان، و BottomBar بثلاثة عناصر تنقل، و FloatingActionButton للإجراء الرئيسي.
@Composable
fun FullScaffold() {
Scaffold(
topBar = {
TopAppBar(
title = { Text("التطبيق") },
navigationIcon = {
IconButton(onClick = {}) {
Icon(Icons.Default.Menu, "Menu")
}
}
)
},
bottomBar = {
NavigationBar {
NavigationBarItem(
icon = { Icon(Icons.Default.Home, "الصفحة الرئيسية") },
label = { Text("Home") },
selected = true,
onClick = {}
)
NavigationBarItem(
icon = { Icon(Icons.Default.Search, "بحث") },
label = { Text("Search") },
selected = false,
onClick = {}
)
}
},
floatingActionButton = {
FloatingActionButton(onClick = {}) {
Icon(Icons.Default.Add, "Add")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("محتوى الشاشة")
}
}
}
ScaffoldState هو كائن حالة Scaffold الذي يجمع بين DrawerState و SnackbarHostState. يدير DrawerState فتح وإغلاق القائمة الجانبية، بينما يدير SnackbarHostState عرض وإخفاء Snackbar. يتم إنشاء الحالة باستخدام rememberScaffoldState() وتمريرها إلى معامل scaffoldState.
DrawerState يوفر طرق open و close للتحكم البرمجي في Drawer. يمكن أن تكون حالة Drawer مفتوحة أو مغلقة أو مفتوحة جزئيًا. drawerGesturesEnabled يسمح بتعطيل إيماءة التمرير لفتح Drawer، مع ترك الفتح البرمجي فقط عبر زر.
SnackbarHostState يدير Snackbar — الإشعارات المؤقتة في الجزء السفلي من الشاشة. تعرض طريقة showSnackbar Snackbar برسالة وإجراء اختياري. وفقًا لـ Material Design Guidelines, 2025، يجب استخدام Snackbar للرسائل القصيرة دون معلومات مهمة بشكل حرج.
@Composable
fun ScaffoldWithDrawer() {
val scaffoldState = rememberScaffoldState()
val scope = rememberCoroutineScope()
Scaffold(
scaffoldState = scaffoldState,
topBar = {
TopAppBar(
title = { Text("القائمة") },
navigationIcon = {
IconButton(onClick = {
scope.launch {
scaffoldState.drawerState.open()
}
}) {
Icon(Icons.Default.Menu, "Menu")
}
}
)
},
drawerContent = {
Column(modifier = Modifier.padding(16.dp)) {
Text("العنصر 1")
Text("العنصر 2")
}
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
Text("المحتوى")
}
}
}
مثال كامل لشاشة مع Scaffold يشمل TopAppBar و BottomNavigation و FloatingActionButton و Snackbar لعرض الإشعارات عند الضغط على FAB. يتم تمرير ScaffoldState إلى جميع المكونات لتنسيق الحالة.
@Composable
fun MainScreen() {
val state = rememberScaffoldState()
val scope = rememberCoroutineScope()
Scaffold(
scaffoldState = state,
topBar = {
TopAppBar(
title = { Text("IT Sectr") },
actions = {
IconButton(onClick = {}) {
Icon(Icons.Default.Notifications, "Notifications")
}
}
)
},
bottomBar = {
NavigationBar {
NavigationBarItem(icon = { Icon(Icons.Default.Home, "الصفحة الرئيسية") },
label = { Text("Home") }, selected = true, onClick = {})
NavigationBarItem(icon = { Icon(Icons.Default.Settings, "الإعدادات") },
label = { Text("Settings") }, selected = false, onClick = {})
}
},
floatingActionButton = {
FloatingActionButton(onClick = {
scope.launch {
state.snackbarHostState.showSnackbar("تم")
}
}) {
Icon(Icons.Default.Add, "Add")
}
}
) { padding ->
Box(
modifier = Modifier.padding(padding).fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("مرحبًا")
}
}
}
innerPadding هي PaddingValues التي تمررها Scaffold إلى كتلة content. تحتوي على الهوامش اللازمة لمنع تداخل المحتوى مع statusBar و navigationBar و topBar و bottomBar. استخدام innerPadding إلزامي للعرض الصحيح على الأجهزة المختلفة.
تحسب Scaffold تلقائيًا innerPadding بناءً على هوامش النظام وارتفاع الفتحات المثبتة. على الأجهزة ذات كاميرا الجزيرة أو القطع في الشاشة، تضبط Scaffold الهوامش لشريط الحالة. على الأجهزة القديمة ذات الأزرار المادية، قد يكون الهامش السفلي غائبًا.
وفقًا لـ Android Developers, 2024، يجب تطبيق innerPadding على الحاوية الجذرية للمحتوى عبر Modifier.padding(innerPadding). إذا كان المحتوى يستخدم حاوية قابلة للتمرير، يتم تطبيق innerPadding عبر Modifier.consumeWindowInsets للتشغيل الصحيح للوحة المفاتيح وإيماءات النظام.
الأسئلة الشائعة
Scaffold ليست حاوية بل مدير تخطيط يتحكم في الفتحات لـ TopAppBar و BottomBar و FAB و Drawer و Snackbar، كما يعالج تلقائيًا الهوامش لمكونات النظام. Column و Box فقط يضعان العناصر دون مراعاة Material Design.
Scaffold موصى بها للشاشات التي تستخدم مكونات Material Design. في الشاشات البسيطة دون TopAppBar أو BottomBar أو FAB، Scaffold ليست إلزامية، لكنها توفر هوامش نظام صحيحة عبر innerPadding، وهو مفيد حتى بدون فتحات.
مرر ScaffoldState إلى معامل scaffoldState لـ Scaffold، ثم استدع state.snackbarHostState.showSnackbar(“رسالة”) داخل coroutine. ستعرض Scaffold تلقائيًا Snackbar في الجزء السفلي من الشاشة.
نعم، Scaffold تنشئ حالة داخلية افتراضيًا إذا لم يتم تمرير scaffoldState. ومع ذلك، للتحكم البرمجي في Drawer و Snackbar، تحتاج إلى إنشاء وتمرير ScaffoldState عبر rememberScaffoldState().
استخدم معامل floatingActionButtonPosition لـ Scaffold. افتراضيًا، يكون FAB في الأسفل الأيمن (FabPosition.End). قم بتعيين FabPosition.Center لوضع FAB في منتصف الحافة السفلية للشاشة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا