Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >一个可组合的喷气式组合是如何意识到它的孩子的?

一个可组合的喷气式组合是如何意识到它的孩子的?
EN

Stack Overflow用户
提问于 2021-12-29 22:06:35
回答 1查看 499关注 0票数 2

这个android教程有以下代码片段:

代码语言:javascript
运行
AI代码解释
复制
@Composable
private fun MyApp() {
    Surface(color = MaterialTheme.colors.background) {
        Greeting("Android")
    }
}

我的第一个想法是,通过调用包含子元素的lambda参数并将其作为返回值返回,从而获得它的问候子函数。但在本教程的后面,我们将得到以下示例:

代码语言:javascript
运行
AI代码解释
复制
@Composable
private fun Greeting(name: String) {
    Surface(color = MaterialTheme.colors.primary) {
        Column(modifier = Modifier.padding(24.dp)) {
            Text(text = "Hello,")
            Text(text = name)
        }
    }
}

无论如何,列都知道"Hello“文本和name文本,尽管调用lambda只会将名称文本作为返回值。

所以我的问题是:是什么机制让一个可组合的人意识到自己的孩子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-31 06:30:33

类似于例如suspend函数,@Composable函数由编译器以非常特殊的方式处理。这是为了允许自动重新组合,并隐式地在组件之间传递上下文。

@Composable的文档指定:

可组合函数的一个有用的心智模型是,隐式“可组合上下文”被传递到可组合函数中,并在从另一个可组合函数中调用时隐式传递。此“上下文”可用于存储以前在树的同一逻辑点执行函数的信息。

通过编写一个简单的可组合函数并分析生成的字节码,我们可以看到它的作用。使用此源代码:

代码语言:javascript
运行
AI代码解释
复制
@Composable
fun Foo() {
    Text("foo")
}

我们得到由数百条指令组成的字节码,其中一些得到的代码甚至被放置在一个单独的合成类中。我们将把重点放在最重要的部分:

代码语言:javascript
运行
AI代码解释
复制
public static final void Foo(androidx.compose.runtime.Composer, int);

正如我们所看到的,我们的无参数Foo()函数实际上隐式地接收一个Composer和一些整数。

代码语言:javascript
运行
AI代码解释
复制
3: invokeinterface #24,  2           // InterfaceMethod androidx/compose/runtime/Composer.startRestartGroup:(I)Landroidx/compose/runtime/Composer;

另一个Composer对象是通过调用接收到的Composer上的startRestartGroup()获得的。

代码语言:javascript
运行
AI代码解释
复制
55: invokestatic  #73                 // Method androidx/compose/material/TextKt."Text-fLXpl1I":(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/font/FontStyle;Landroidx/compose/ui/text/font/FontWeight;Landroidx/compose/ui/text/font/FontFamily;JLandroidx/compose/ui/text/style/TextDecoration;Landroidx/compose/ui/text/style/TextAlign;JIZILkotlin/jvm/functions/Function1;Landroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V

这是打给Text()的电话。由于有大量的可选参数,所以很难读取,但是我们可以注意到它也接收到了一个Composer对象。这个参数是合成的,我们在Text()参数列表中找不到它--类似于我们的Foo()函数。

Foo()startRestartGroup()获得的作曲家传递给Text()

虽然我不知道Composer的确切功能和含义,但我们可以清楚地看到,Compose框架隐式地传递可组合函数之间的上下文,从而可以将组件连接在一起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70528010

复制
相关文章
可组合的 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 归档