代码A来自官方样本项目。
我想我使用的是一个函数而不是val background
,但是代码B是错误的。
当我在Kotlin中使用val
时,如何将fun
转换为Jetpack Compose
?
码A
@Composable
fun NiaApp(
windowSizeClass: WindowSizeClass,
appState: NiaAppState = rememberNiaAppState(windowSizeClass)
) {
NiaTheme {
val background: @Composable (@Composable () -> Unit) -> Unit =
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
background {
Scaffold(
...
) { padding ->
Row(
...
) {
...
}
}
}
}
码B
@Composable
fun NiaApp(
windowSizeClass: WindowSizeClass,
appState: NiaAppState = rememberNiaAppState(windowSizeClass)
) {
NiaTheme {
@Composable
fun background(aa: @Composable () -> Unit){
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
}
background {
Scaffold(
...
) { padding ->
Row(
...
) {
...
}
}
}
}
添加的内容:
给阿维特·舒克拉:谢谢!
代码C是基于代码A的val background: @Composable (@Composable () -> Unit) -> Unit...
。
你的代码D是对的,但是为什么代码C是错误的?
代码C
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
}
码D
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> NiaGradientBackground(content = content)
else -> NiaBackground(content = content)
}
}
再次添加内容:
给阿维特·舒克拉:谢谢!
顺便说一下,代码E和代码F不能编译。
码E
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}(content) // Call the lambda
}
码F
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit -> NiaGradientBackground(content = content)
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}(content) // Call the lambda
}
新内容:
给阿维特·舒克拉:谢谢!
顺便说一句,代码G还不能编译,我得到了以下错误。
@Composable调用只能在@Composable函数的上下文中发生
码G
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content1: @Composable () -> Unit -> NiaGradientBackground(content = content1) }
else -> { content1: @Composable () -> Unit -> NiaBackground(content = content1) }
}(content) // Call the lambda
}
发布于 2022-10-22 08:28:22
你可以试试这个:
@Composable
fun NiaApp(
windowSizeClass: WindowSizeClass,
appState: NiaAppState = rememberNiaAppState(windowSizeClass)
) {
NiaTheme {
Background(appState) {
Scaffold(
...
) { padding ->
Row(
...
) {
...
}
}
}
}
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> NiaGradientBackground(content = content)
else -> NiaBackground(content = content)
}
}
编辑:代码C中的when
语句只创建一个lambda函数,当调用该函数时将调用可组合函数。您也需要调用lambda才能看到任何效果:
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}(content) // Call the lambda
}
注意:我还没有运行这段代码,但是编译器可能会在这里给出一个错误,说明它无法推断content
变量在lambda中的类型。在这种情况下,您必须显式地提供类型:content: @Composable () -> Unit -> NiaGradientBackground(content = content)
无论如何,这是太多不必要的努力,只会使代码比原来的代码更加复杂。代码D非常简单。
编辑:在代码G中的,默认情况下,lambda不是一个可组合的函数,您不能在其中调用可组合函数。仅仅将@Composable
放在lambda前面是行不通的,您需要显式地为整个when
表达式提供类型。
@Composable
fun Background(
appState: NiaAppState,
content: @Composable () -> Unit
) {
val background: @Composable (@Composable () -> Unit) -> Unit =
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
background(content)
}
我们到达的代码与您想要简化的代码相同。在我看来,代码D是最好的解决方案。
发布于 2022-10-18 07:40:00
嗯,就像这样:
@Composable
fun NiaApp(
windowSizeClass: WindowSizeClass,
appState: NiaAppState = rememberNiaAppState(windowSizeClass) ) {
NiaTheme {
background(appState)() {
Scaffold(
...
) { padding ->
}
}
}
}
@Composable
fun background(appState: NiaAppState): @Composable (@Composable () -> Unit) -> Unit =
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content ->
NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
发布于 2022-10-17 03:27:28
只需剪切Background
可组合函数并将其粘贴到NiaApp
可组合函数的外部即可。
@Composable
fun NiaApp(
windowSizeClass: WindowSizeClass,
appState: NiaAppState = rememberNiaAppState(windowSizeClass)
) {
NiaTheme {
background {
Scaffold(
...
) { padding ->
Row(
...
) {
...
}
}
}
}
@Composable
fun background(aa: @Composable () -> Unit){
when (appState.currentDestination?.route) {
ForYouDestination.route -> { content ->
NiaGradientBackground(content = content) }
else -> { content -> NiaBackground(content = content) }
}
}
https://stackoverflow.com/questions/74092059
复制相似问题