Scaffold در Jetpack Compose — این چیست، ویژگی‌ها و نحوه کار

نویسنده: IT Sectr منتشر شده: 2026-06-29 زمان مطالعه: 11 دقیقه

Scaffold — یک تابع composable در Jetpack Compose است که ساختار پایه صفحه را بر اساس مشخصات Material Design پیاده می‌کند. Scaffold برای TopAppBar، BottomBar، FloatingActionButton، Drawer و Snackbar سلات تامین می‌کند. به گزارش Google Android Documentation, 2025، Scaffold عنصری اجباری در اکثر صفحات در برنامه‌های Compose است، زیرا فاصله‌ها را برای جزء مانندهای سیستم Material Design مدیریت می‌کند.

نکات کلیدی

  • Scaffold — چارچوب صفحه Material Design که سلاتی برای TopAppBar، BottomBar، FAB، Drawer و Snackbar با فاصله‌های درست تامین می‌کند.
  • ScaffoldState وضعیت Drawer و Snackbar را مدیریت می‌کند، باز و بسته شدن منوی کناری و نمایش اطلاعیه‌ها را تأمین می‌کند.
  • topBar، bottomBar و floatingActionButton — سلاتهای Scaffold برای ادغام جزء ماننده‌های استاندارد Material Design.
  • drawerGesturesEnabled جست باز شدن منوی کناری را مدیریت می‌کند و snackbarHost نمایش سفارشی Snackbar را انجام می‌دهد.
  • Scaffold فاصله‌ها را برای نوار وضعیت و پانل ناوبری از طریق innerPadding به صورت خودکار مدیریت می‌کند.

Scaffold در Jetpack Compose چیست

Scaffold — یک تابع composable است که چارچوب صفحه را بر اساس مشخصات Material Design پیاده می‌کند. Scaffold یک کانتینر به معنای معمولی نیست — این یک مدیر چیدمان است که قرارگیری چند جزء ماننده استاندارد Material را در صفحه هماهنگ می‌کند.

Scaffold فاصله‌ها را برای TopAppBar، BottomBar و FloatingActionButton و نیز عناصر سیستم — نوار وضعیت و پانل ناوبری را مدیریت می‌کند. این تضمین می‌کند که محتوا روی عناصر سیستم قرار نگیرد و با دستورالعملهای Material Design مطابقت داشته باشد.

به گزارش Material Design Guidelines, 2025، Scaffold باید عنصر ریشه هر صفحه برنامه باشد. آن CoordinatorLayout منسوخ را از سیستم View جایگزین می‌کند و API ساده‌تر و اعلانی برای ساخت چیدمان صفحه تامین می‌کند.

امضای پایه Scaffold

Scaffold پارامترهای modifier، scaffoldState، topBar، bottomBar، floatingActionButton، drawerContent، snackbarHost و content را می‌پذیرد. پارامتر content PaddingValues — فاصله‌هایی را که محتوای اصلی باید در نظر بگیرد دریافت می‌کند.

kotlin
@Composable
fun BasicScaffold() {
    Scaffold(
        topBar = {
            TopAppBar(
                title = { Text("خانه") }
            )
        },
        floatingActionButton = {
            FloatingActionButton(onClick = {}) {
                Icon(Icons.Default.Add, contentDescription = "Add")
            }
        }
    ) { innerPadding ->
        Column(
            modifier = Modifier.padding(innerPadding)
        ) {
            Text("محتوای اصلی")
        }
    }
}

سلاتهای Scaffold: topBar، bottomBar و floatingActionButton

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 برای عمل اصلی.

kotlin
@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: مدیریت Drawer و Snackbar

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 برای پیام‌های کوتاه بدون اطلاعات حیاتی مهم استفاده شود.

kotlin
@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("آیتم ۱")
                Text("آیتم ۲")
            }
        }
    ) { innerPadding ->
        Box(modifier = Modifier.padding(innerPadding)) {
            Text("محتوا")
        }
    }
}

مثال ساخت صفحه با Scaffold

یک مثال کامل از صفحه با Scaffold شامل TopAppBar، BottomNavigation، FloatingActionButton و Snackbar برای نمایش اطلاعیه پس از فشاردن FAB است. ScaffoldState برای هماهنگی وضعیت به همه کامپوننت‌ها ارسال می‌شود.

kotlin
@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 و چیدمان سازگار با Scaffold

innerPadding — PaddingValuesی است که Scaffold به بلوک content ارسال می‌کند. آنها شامل فاصله‌هایی هستند که برای جلوگیری از قرار گرفتن محتوا روی statusBar، navigationBar، topBar و bottomBar لازم هستند. استفاده از innerPadding برای نمایش درست در دستگاه‌های مختلف اجباری است.

Scaffold innerPadding را بر اساس فاصله‌های سیستم و ارتفاع سلاتهای نصب شده به صورت خودکار محاسبه می‌کند. در دستگاه‌های با جزیره دوربین یا بریدگی صفحه، Scaffold فاصله‌ها را برای نوار وضعیت تصحیح می‌کند. در دستگاه‌های قدیمی با دکمه‌های فیزیکی، فاصله پایین ممکن است صفر باشد.

به گزارش Android Developers, 2024، innerPadding باید از طریق Modifier.padding(innerPadding) به کانتینر ریشه محتوا اعمال شود. اگر محتوا از کانتینر قابل پیمایش استفاده می‌کند، innerPadding از طریق Modifier.consumeWindowInsets برای کار درست صفحه کلید و جست‌های سیستم اعمال می‌شود.

  • innerPadding را از طریق Modifier.padding(innerPadding) به کانتینر ریشه محتوا اعمال کنید
  • برای کانتینرهای قابل پیمایش از Modifier.consumeWindowInsets(innerPadding) استفاده کنید
  • فاصله‌های اضافی برای نوار وضعیت اضافه نکنید — Scaffold این کار را به صورت خودکار انجام می‌دهد
  • در صورت عدم وجود topBar یا bottomBar، فاصله‌های مربوطه در innerPadding صفر خواهند بود

سؤالات متداول

Scaffold چه تفاوتی با Column یا Box معمولی دارد؟

Scaffold یک کانتینر نیست، بلکه یک مدیر چیدمان است که سلاتها را برای TopAppBar، BottomBar، FAB، Drawer و Snackbar مدیریت می‌کند و فاصله‌ها را برای جزء ماننده‌های سیستم به صورت خودکار پردازش می‌کند. Column و Box فقط عناصر را بدون در نظر گرفتن Material Design قرار می‌دهند.

آیا استفاده از Scaffold در هر صفحه اجباری است؟

Scaffold برای صفحاتی که از جزء ماننده‌های Material Design استفاده می‌کنند توصیه می‌شود. در صفحات ساده بدون TopAppBar، BottomBar یا FAB، Scaffold اجباری نیست، اما فاصله‌های درست سیستم را از طریق innerPadding تأمین می‌کند که حتی بدون سلات نیز مفید است.

چگونه Snackbar را از طریق Scaffold نمایش دهیم؟

ScaffoldState را به پارامتر scaffoldState Scaffold ارسال کنید، سپس داخل کوروتین state.snackbarHostState.showSnackbar(«پیام») را فراخوان کنید. Scaffold به طور خودکار Snackbar را در بخش پایین صفحه نمایش خواهد داد.

آیا می‌توان از Scaffold بدون scaffoldState استفاده کرد؟

بله، Scaffold در صورتی که scaffoldState ارسال نشود، به صورت پیش‌فرض وضعیت داخلی ایجاد می‌کند. اما برای مدیریت برنامه‌ای Drawer و Snackbar، باید ScaffoldState را از طریق rememberScaffoldState() ایجاد و ارسال کنید.

چگونه موقعیت FloatingActionButton را در Scaffold تغییر دهیم؟

از پارامتر floatingActionButtonPosition Scaffold استفاده کنید. به صورت پیش‌فرض، FAB در پایین راست قرار دارد (FabPosition.End). FabPosition.Center را برای قراردادن FAB در مرکز لبه پایین اکران تنظیم کنید.

خلاصه

  • Scaffold — چارچوب صفحه Material Design با مدیریت سلات برای TopAppBar، BottomBar، FAB، Drawer و Snackbar و فاصله‌های خودکار سیستم.
  • topBar، bottomBar و floatingActionButton — سلاتهای Scaffold برای ادغام جزء ماننده‌های استاندارد با موقعیت‌یابی درست.
  • ScaffoldState DrawerState و SnackbarHostState را ترکیب می‌کند و مدیریت برنامه‌ای منوی کناری و اطلاعیه‌ها را از طریق کوروتین‌ها تأمین می‌کند.
  • innerPadding — پارامتر اجباری بلوک content حاوی فاصله‌ها برای عناصر سیستم و سلاتهای نصب شده Scaffold.
  • drawerGesturesEnabled و floatingActionButtonPosition — پارامترهای اضافی برای تنظیم دقیق رفتار Scaffold.
  • Scaffold فاصله‌ها را برای نوار وضعیت و پانل ناوبری روی دستگاه‌های با پیکربندی‌های مختلف اکران به صورت خودکار پردازش می‌کند.
  • برای صفحات ساده بدون جزء ماننده‌های Material، Scaffold اجباری نیست اما به عنوان عنصر ریشه برای عملکرد درست فاصله‌های سیستم توصیه می‌شود.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید