کشوی پیمایش

مؤلفه کشوی پیمایش منویی لغزشی است که به کاربران امکان می‌دهد به بخش‌های مختلف برنامه شما پیمایش کنند. کاربران می‌توانند آن را با تند کشیدن از کنار یا ضربه زدن روی نماد منو فعال کنند.

این سه مورد استفاده را برای پیاده‌سازی «کشوی پیمایش» درنظر بگیرید:

  • سازمان‌دهی محتوا: به کاربران امکان می‌دهد بین دسته‌های مختلف جابه‌جا شوند، مثلاً در برنامه‌های خبری یا وبلاگ‌نویسی.
  • مدیریت حساب: پیوندهای سریع به تنظیمات حساب و بخش‌های نمایه در برنامه‌های دارای حساب کاربری ارائه دهید.
  • کاوش ویژگی: سازمان‌دهی چندین ویژگی و تنظیم در یک منو برای تسهیل کاوش و دسترسی کاربر در برنامه‌های پیچیده.

در «طراحی مواد»، دو نوع کشوی پیمایش وجود دارد:

  • استاندارد: فضای داخل صفحه را با محتوای دیگر هم‌رسانی کنید.
  • مدال: روی محتوای دیگر در صفحه ظاهر می‌شود.
نمونه‌ای از کشوی پیمایش Material Design 3 در حالت روشن و تاریک.
شکل ۱. نمونه‌ای از کشوی پیمایش.

مثال

می‌توانید از ترکیب‌پذیر ModalNavigationDrawer برای پیاده‌سازی کشوی پیمایش استفاده کنید.

از جایگاه drawerContent برای ارائه ModalDrawerSheet و ارائه محتوای کشو استفاده کنید، مانند مثال زیر:

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            Text("Drawer title", modifier = Modifier.padding(16.dp))
            HorizontalDivider()
            NavigationDrawerItem(
                label = { Text(text = "Drawer Item") },
                selected = false,
                onClick = { /*TODO*/ }
            )
            // ...other drawer items
        }
    }
) {
    // Screen content
}

ModalNavigationDrawer تعدادی پارامتر کشو اضافی را می‌پذیرد. برای مثال، می‌توانید بااستفاده از پارامتر gesturesEnabled، پاسخ دادن یا ندادن کشو به کشیدن را تغییر دهید، مانند مثال زیر:

ModalNavigationDrawer(
    drawerContent = {
        ModalDrawerSheet {
            // Drawer contents
        }
    },
    gesturesEnabled = false
) {
    // Screen content
}

کنترل کردن رفتار

برای کنترل نحوه باز و بسته شدن کشو، از DrawerState استفاده کنید. باید DrawerState را بااستفاده از پارامتر drawerState به ModalNavigationDrawer منتقل کنید.

DrawerState دسترسی به عملکردهای open و close و همچنین ویژگی‌های مربوط به وضعیت کشوی فعلی را فراهم می‌کند. این توابع تعلیق به CoroutineScope نیاز دارند که می‌توانید آن را بااستفاده از rememberCoroutineScope نمونه‌سازی کنید. همچنین می‌توانید توابع تعلیق را در پاسخ به رویدادهای میانای کاربر فراخوانی کنید.

val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
val scope = rememberCoroutineScope()
ModalNavigationDrawer(
    drawerState = drawerState,
    drawerContent = {
        ModalDrawerSheet { /* Drawer content */ }
    },
) {
    Scaffold(
        floatingActionButton = {
            ExtendedFloatingActionButton(
                text = { Text("Show drawer") },
                icon = { Icon(Icons.Filled.Add, contentDescription = "") },
                onClick = {
                    scope.launch {
                        drawerState.apply {
                            if (isClosed) open() else close()
                        }
                    }
                }
            )
        }
    ) { contentPadding ->
        // Screen content
    }
}

ایجاد گروه‌ها در کشوی پیمایش

قطعه کد زیر نحوه ایجاد یک کشوی پیمایش دقیق را با بخش‌ها و جداکننده‌ها نشان می‌دهد:

@Composable
fun DetailedDrawerExample(
    content: @Composable (PaddingValues) -> Unit
) {
    val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
    val scope = rememberCoroutineScope()

    ModalNavigationDrawer(
        drawerContent = {
            ModalDrawerSheet {
                Column(
                    modifier = Modifier.padding(horizontal = 16.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    Spacer(Modifier.height(12.dp))
                    Text("Drawer Title", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleLarge)
                    HorizontalDivider()

                    Text("Section 1", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Item 1") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Item 2") },
                        selected = false,
                        onClick = { /* Handle click */ }
                    )

                    HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp))

                    Text("Section 2", modifier = Modifier.padding(16.dp), style = MaterialTheme.typography.titleMedium)
                    NavigationDrawerItem(
                        label = { Text("Settings") },
                        selected = false,
                        icon = { Icon(painter = rememberVectorPainter(AppIcons.Settings), contentDescription = null) },
                        badge = { Text("20") }, // Placeholder
                        onClick = { /* Handle click */ }
                    )
                    NavigationDrawerItem(
                        label = { Text("Help and feedback") },
                        selected = false,
                        icon = { Icon(painter = rememberVectorPainter(AppIcons.Help), contentDescription = null) },
                        onClick = { /* Handle click */ },
                    )
                    Spacer(Modifier.height(12.dp))
                }
            }
        },
        drawerState = drawerState
    ) {
        Scaffold(
            topBar = {
                TopAppBar(
                    title = { Text("Navigation Drawer Example") },
                    navigationIcon = {
                        IconButton(onClick = {
                            scope.launch {
                                if (drawerState.isClosed) {
                                    drawerState.open()
                                } else {
                                    drawerState.close()
                                }
                            }
                        }) {
                            Icon(painter = rememberVectorPainter(AppIcons.Menu), contentDescription = "Menu")
                        }
                    }
                )
            }
        ) { innerPadding ->
            content(innerPadding)
        }
    }
}

نکات کلیدی درباره کد

  • drawerContent را با Column حاوی بخش‌ها، جداکننده‌ها، و موارد پیمایش پر می‌کند.
  • ModalDrawerSheet سبک Material Design را برای کشو ارائه می‌دهد.
  • HorizontalDivider بخش‌ها را در کشو ازهم جدا می‌کند.
  • ModalNavigationDrawer کشو را ایجاد می‌کند.
  • ‫drawerContent محتوای کشو را تعریف می‌کند.
  • درون ModalDrawerSheet، یک Column عناصر کشو را به‌صورت عمودی مرتب می‌کند.
  • NavigationDrawerItem composables represent individual items in the drawer.
  • ‫Scaffold ساختار اصلی صفحه را ارائه می‌دهد، ازجمله TopAppBar.
  • ‫navigationIcon در TopAppBar وضعیت باز و بسته بودن کشو را کنترل می‌کند.

نتیجه

تصویر زیر نشان می‌دهد که کشو هنگام باز شدن چگونه ظاهر می‌شود و بخش‌ها و موارد چگونه نمایش داده می‌شوند:

کشوی پیمایش با جزئیات با دو بخش، هرکدام با چندین مورد و نماد برچسب‌گذاری‌شده.
شکل ۲. کشوی پیمایش با دو گروه تودرتو باز شده است.

منابع بیشتر