首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用Kotlin中的Jetpack作曲时,如何将val转换为乐趣?

当我使用Kotlin中的Jetpack作曲时,如何将val转换为乐趣?
EN

Stack Overflow用户
提问于 2022-10-16 18:26:44
回答 3查看 206关注 0票数 0

代码A来自官方样本项目

我想我使用的是一个函数而不是val background,但是代码B是错误的。

当我在Kotlin中使用val时,如何将fun转换为Jetpack Compose

码A

代码语言:javascript
运行
AI代码解释
复制
@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

代码语言:javascript
运行
AI代码解释
复制
@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

代码语言:javascript
运行
AI代码解释
复制
@Composable
fun Background(
    appState: NiaAppState,
    content: @Composable () -> Unit
) {
    when (appState.currentDestination?.route) {
        ForYouDestination.route -> { content -> NiaGradientBackground(content = content) }
        else -> { content -> NiaBackground(content = content) }
    } 
}

码D

代码语言:javascript
运行
AI代码解释
复制
@Composable
fun Background(
    appState: NiaAppState,
    content: @Composable () -> Unit
) {
    when (appState.currentDestination?.route) {
        ForYouDestination.route -> NiaGradientBackground(content = content)
        else -> NiaBackground(content = content)
    }
}

再次添加内容:

给阿维特·舒克拉:谢谢!

顺便说一下,代码E和代码F不能编译。

码E

代码语言:javascript
运行
AI代码解释
复制
@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

代码语言:javascript
运行
AI代码解释
复制
@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

代码语言:javascript
运行
AI代码解释
复制
@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
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-22 08:28:22

你可以试试这个:

代码语言:javascript
运行
AI代码解释
复制
@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才能看到任何效果:

代码语言:javascript
运行
AI代码解释
复制
@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表达式提供类型。

代码语言:javascript
运行
AI代码解释
复制
@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是最好的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2022-10-18 07:40:00

嗯,就像这样:

代码语言:javascript
运行
AI代码解释
复制
@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) }
            } 
票数 1
EN

Stack Overflow用户

发布于 2022-10-17 03:27:28

只需剪切Background可组合函数并将其粘贴到NiaApp可组合函数的外部即可。

代码语言:javascript
运行
AI代码解释
复制
@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) }
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74092059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档