Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当我使用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

复制
相关文章
可组合的 Vue
2021年5月来自全球各地的Vue.js开发者齐聚线上,一起见证了VueConf 2021 杭州的成功举办。
@超人
2021/07/05
4890
可组合的 Vue
函数c()_函数的调用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/15
3.7K0
匿名函数自调用_自己调用自己的函数叫
我们知道一个HTML文件在被加载的时候是从根标签html依次往下的,在遇到link,script等标签引入的外部资源时,下载外部资源,并执行外部资源。在js中,表达式会被立即执行,也就是说,不管是引入的外部js文件还是嵌入在html文件中的js脚本,其中的表达式都会被立即执行。 函数名是一个指向函数的指针。在JavaScript中,定义函数有常见的两种形式:函数声明和函数直接量(或者叫函数表达式)。 函数声明:采用function定义声明函数的标准写法,包括function,函数名,函数体。如
全栈程序员站长
2022/11/09
2.6K0
奇怪的函数调用
整理移动硬盘时,发现一个名为 attack 的目录,进去以后发现原来是一段简单的 C 语言代码。代码如下:
码农UP2U
2021/09/02
1.8K0
奇怪的函数调用
oracle函数的调用应使用execute命令_matlab函数调用
之前一直使用的MySQL数据库,第一次接触Oracle就用到了函数和存储过程,今天跟大家分享一下使用过程.
全栈程序员站长
2022/10/04
2.3K0
oracle函数的调用应使用execute命令_matlab函数调用
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
函数的不同使用场合,this有不同的值。 总的来说,this就是函数运行时所在的环境对象。 下面分情况,详细讨论
JavaEdge
2018/08/02
2.8K0
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
c++函数调用,函数编写(写自己的函数)以及数组调用,传递
在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到的函数
用户7886150
2021/02/03
2.4K0
Lua函数的冒号调用和点调用
冒号定义函数中的self指向函数所属表对象,即self是table类型,通过self表可以:访问挂载在该表下的所有冒号定义函数 如,有定义A={},A:b() A:c();函数b,c都是冒号定义函数,在b,c函数内部self是地址指向A的表,在b函数中可以通过self:c()来调用c函数,同理在c函数中也可以通过self:b()来调用b函数 代码示例:
bering
2020/03/19
3.4K0
python之函数的调用
  实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代码的复用,还可以使代码更有条理性,增加代码的可靠性。下面我们来介绍一下python的调用相关内容。
jiankang666
2022/12/05
1.1K0
python之函数的调用
Python调用PHP的函数
        在电子商务的web平台中有可能存在这样的需求,在月末进行分红账务结算,这样就需要在web服务器下写脚本定时执行数据库的操作,这里有很多种可选的方案,Python调
py3study
2020/01/07
3.5K0
函数的调用约定 _cdecl
_cdecl(C declaration,即C声明)是源起C语言的一种调用约定,它规定,在C语言中,函数实参在线程栈上按照从右至左的顺序依次压栈,也就是说,函数参数从右往左传入。
叶茂林
2023/07/28
3870
函数的调用约定 _cdecl
(十七)函数的调用签名
# 一、函数的调用签名 说明 函数的调用签名跟我们上节课使用 type 来定义函数类型的效果基本类型是一样的 但是它支持函数附带额外属性的情况,因为在 javasctipt 里面函数也是一个特殊的对象,可以包含额外的属性 例 // 和我们之前 使用 type 定义函数类型是一样的,只是调用签名是对象形式 type RequesCallback = { (result: string): void // 以为是对象形式,所以不能使用箭头函数 } function request(callba
老怪兽
2023/02/22
1K0
函数的定义和调用
1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){} 方式3 new Function( '参数1', '参数2',' 函数体'); var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); console.1og(f instanceof Object ); //instanceof
星辰_大海
2020/10/26
1.6K0
函数的定义和调用
【编程经验】函数的调用
主调函数使用被调函数的功能,称为函数调用。在 C 语言中,只有在函数调用时,函数体中定义的功 能才会被执行。
编程范 源代码公司
2018/07/24
8350
函数的定义和调用
1.函数的定义和调用 1.1函数的定义方式 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn = function(){ 方式3 new Function() var f = new Function('a', 'b', 'console.log(a + b)'); f(1, 2); ​ var fn = new Function('参数1','参数2'..., '函数体') 1.2函数的调用方式 普通函数
梨涡浅笑
2020/10/27
9120
函数的定义和调用
image.png
清出于兰
2022/05/11
9970
函数的定义和调用
JavaScript 函数调用
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
陈不成i
2021/07/19
2.3K0
关于调用函数
在调用函数时只需要传入指定数量和指定类型的值在参数表的指定位置这些值将在方法启动前赋值给形参
算法与编程之美
2022/10/28
1.5K0
关于调用函数
函数调用约定
现代的几乎所有的编程语言都离不开函数和参数的概念。而这个概念是编程语言级别的,而不是硬件级别的。也就是说硬件上本来没有函数的概念。只是函数的用的太普遍,硬件开始为函数准备专用的指令。
战神伽罗
2019/08/13
2.4K0
函数调用约定
在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。
Elapse
2020/08/17
2K0

相似问题

可组合函数可以调用不可组合函数吗?

12

从可鼠标调用可组合函数

11

可观测函数中调用可组合函数的问题

13

如何在可组合内部调用内部函数?

17

如何从不可组合函数调用可组合通知对话框

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档