我在YouTube上学做了这个抽屉

https://www.youtube.com/watch?v=JLICaBEiJS0&list=PLQkwcJG4YTCSpJ2NLhDTHhi6XBNfk9WiC&index=31个 菲利普·拉克纳

SwipeScreen enter image description here

我想把抽屉添加到我的应用程序中,它有多个屏幕,其中一些不需要抽屉,所以我实现了屏幕导航,有些屏幕还需要让抽屉在上面包装它们.

这是抽屉的代码


val scaffoldState = rememberScaffoldState()
                val scope = rememberCoroutineScope()
                Scaffold(
                    drawerGesturesEnabled = scaffoldState.drawerState.isOpen,
                    scaffoldState = scaffoldState, topBar = {
                    AppBar(onNavigationIconClick = {
                        scope.launch {
                            scaffoldState.drawerState.open()
                        }

                    })
                }, drawerContent = {
                    DrawerHeader()
                    DrawerBody(items = listOf(
                        MenuItem(
                            id = "home",
                            title = "Home",
                            contentDescription = "Go to home screen",
                            icon = Icons.Default.Home
                        ),
                        MenuItem(
                            id = "settings",
                            title = "Settings",
                            contentDescription = "Go to Settings screen",
                            icon = Icons.Default.Settings
                        ),
                        MenuItem(
                            id = "help",
                            title = "Help",
                            contentDescription = "Go to help screen",
                            icon = Icons.Default.Info
                        ),
                    ), onItemClick = {
                        println("Clicked on ${it.title}")

                        when (it.id) {
                            "home" -> {
                                println("Clicked on ${it.title}")
                            }
                            "settings" -> {
                                println("Clicked on ${it.title}")
                            }
                            "help" -> {
                                println("Clicked on ${it.title}")
                            }
                        }
                    })

                }) {

                    Text(text = "Hello World")

                }

文本=Hlowworld是我想要传递屏幕参数的地方,我不知道怎么做.我想添加一个参数,该参数接受可组合函数并在内部运行它

我关注了这段导航视频,了解如何在Kotlin 导航

https://www.youtube.com/watch?v=4gUeyNkGE3g&list=PLQkwcJG4YTCSpJ2NLhDTHhi6XBNfk9WiC&index=18

它有3个大文件,所以如果你问我,我会把它们贴在这里,但我会尽量更具体地说明需要什么

composable(route = Screen.RegisterScreen.route) {
            RegisterScreen(navController = navCotroller)
        }

如果我把代码放在抽屉里,它会工作得很好,但我想拆分代码以使其更干净,因为我在更多的地方使用抽屉

代码的工作方式与下面的示例类似

composable(route = Screen.PreferenceScreen.route) {
            val scaffoldState = rememberScaffoldState()
            val scope = rememberCoroutineScope()
            Scaffold(

                drawerGesturesEnabled = scaffoldState.drawerState.isOpen,
                scaffoldState = scaffoldState,
                topBar = {
                    AppBar(onNavigationIconClick = {
                        scope.launch {
                            scaffoldState.drawerState.open()
                        }

                    })
                },
                drawerContent = {
                    DrawerHeader()
                    DrawerBody(items = listOf(
                        MenuItem(
                            id = "swipe",
                            title = "Swipe",
                            contentDescription = "Go to Swipe screen",
                            icon = Icons.Default.Home
                        ),
                        MenuItem(
                            id = "settings",
                            title = "Settings",
                            contentDescription = "Go to Settings screen",
                            icon = Icons.Default.Settings
                        ),
                        MenuItem(
                            id = "profile",
                            title = "Profile",
                            contentDescription = "Go to profile screen",
                            icon = Icons.Default.Info
                        ),
                    ), onItemClick = {
                        when (it.id) {
                            "swipe" -> {
                                navCotroller.navigate(Screen.SwipeScreen.route)
                            }
                            "settings" -> {
                                navCotroller.navigate(Screen.PreferenceScreen.route)
                            }
                            "profile" -> {
                                navCotroller.navigate(Screen.CelebProfileScreen.route)
                            }
                        }
                    })

                }) {

         ----->        PreferenceScreen(navController = navCotroller)

            }

        }

但这不是干净的代码!!我如何使用函数指针使其工作??

enter image description here

推荐答案

我不能编译你的代码,我不确定这是否能解决你的问题,但基于这个

…我想添加一个参数,该参数接受可组合函数并运行 它在里面

你可以把它作为参考.考虑这样一个可组合的组件,它获取任何可组合组件并在内部运行它

@Composable
fun AnyComposable(
    anyComposable: @Composable () -> Unit
) {
    anyComposable()
}

和另一个Composable,它使用上面的Composable并将任何其他Composable传递给它,如下所示

@Composable
fun MyScreen() {

    // big red Box composable
    val composable1 = @Composable {
        Box (
            modifier = Modifier
                .size(200.dp)
                .background(Color.Red)
        )
    }

    // small blue Box composable
    val composable2 = @Composable {
        Box(
            modifier = Modifier
                .size(80.dp)
                .background(Color.Blue)
        )
    }

    // small green rectangular Box composable
    val composable3 = @Composable {
        Box(
            modifier = Modifier
                .size(width = 100.dp, height = 30.dp)
                .background(Color.Green)
        )
    }

    var dynamicComposable by remember { mutableStateOf<@Composable () -> Unit> (@Composable { composable1() }) }

    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {

        Row(
            modifier = Modifier.fillMaxWidth(),
            verticalAlignment = Alignment.CenterVertically,
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            Button(onClick = {
                dynamicComposable = composable1
            }) {
                Text("Comp 1")
            }

            Button(onClick = {
                dynamicComposable = composable2
            }) {
                Text("Comp 2")
            }

            Button(onClick = {
                dynamicComposable = composable3
            }) {
                Text("Comp 3")
            }
        }

        AnyComposable {
            dynamicComposable()
        }
    }
}

以及输出:

enter image description here

Android相关问答推荐

Android Studio -未显示布局预览(不推荐使用安全管理器)

无法将非静态方法与Frida挂钩

在Jetpack Compose中,如何判断屏幕是否已重新组合?

Jetpack Compose-如何在进入新产品线之前删除单词?

未解析的引用:视图模型

如何在Jetpack Compose中向SearchBar添加边框

如何在 compose 中使用可变对象?

React-Native Manifest 合并失败并出现多个错误

Andorid Studio编译器如何自动为变量editText生成mutableStateOf("")的方法名?

面向Jetpack Compose的可组合放置问题

是否可以按照干净的体系 struct 将活动实例传递给视图模型

在 Jetpack Compose 中自动滚动后面的项目

从活动共享视图模型以使用 hilt 组合函数

Jetpack Compose 动画性能问题

使用 capacitor cordova 插件的 Android Studio 错误

单击登录按钮后从应用程序中退出

Android Compose webview 被拉伸

WearOS - 有没有办法从心电图传感器收集原始数据?

未使用的内容填充参数

错误:没有这样的属性:类的组:org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer