概念Composable Index Templates(可组合索引模板) 是 Elasticsearch 7.8+ 引入的新一代索引模板机制,相比旧版 Legacy Index Templates 可组合性:通过组件模板实现配置复用Composable Index Templates 支持将通用的配置(如 settings、mappings、aliases)拆分为组件模板(Component Templates 灵活的组合策略:支持多个组件模板叠加Composable Index Templates 允许通过 composed_of引用多个组件模板,这些模板的配置会按顺序合并(后定义的组件覆盖前面的同名配置) 二、新版方式(Composable Index Template,推荐)从 Elasticsearch 7.8+ 开始,推荐使用 Composable Index Template(通过 _index_template ✅ 新版(Composable 方式)的优势:组件模板(Component Template):把公共的 settings 和 mappings 抽出来,一次定义,多次复用。
机器之心专栏 机器之心编辑部 Composable Kernel(CK)库旨在提供一套在 AMD GPU 上算子融合的后端方案,该研究希望未来能够移植到 AMD 的所有 GPU 上,并且最终也可以被移植到 Composable Kernel (CK)库旨在提供一套在 AMD GPU 上的算子融合的后端方案。CK 使用通用编程语言 HIP C++,完全开源。 CK 源代码:https://github.com/ROCmSoftwarePlatform/composable_kernel 核心概念 CK 引入了两个概念以提高后端开发者的生产力: 1. MLSE 10.23.22 using AITemplate https://github.com/ROCmSoftwarePlatform/AITemplate, commit f940d9b) + Composable Kernel https://github.com/ROCmSoftwarePlatform/composable_kernel, commit 40942b9) with ROCm™5.3 running
Composable 函数剖析 这是一个 Composable 函数的示例: @Composable fun App(appData: AppData) { val derivedData = compute 理想情况下,这一数据是不可变数据,而且 Composable 函数也不会改变: Composable 函数应当成为这一数据的转换函数。 Composable 函数通常利用 Kotlin 的尾随 lambda 语法,所以 Body() 是一个含有 Composable lambda 参数的 Composable 函数。 () } } @Composable fun Story(…) { /* ... */ } @Composable fun EditForm(...) { /* ... */ } @Composable 另一方面,Composable 函数可以管理和创建状态,然后将该状态及它接收到的任何数据作为参数传递给其他的 Composable 函数。
__call__) x = func(x) i -= 1 return x return retFunc 2. composable 实现composable函数,满足如下操作: @composable def add2(x): return x + 2 @composable def mul3(x): return (pow2(n)))` print fn(5) # 77 composable函数接受一个函数,返回一个封装后的东西让其可以通过*来复合。 class Composable(object): def __init__(self, *args): object. )) return Composable(*(self.func + rv.func)) composable = Composable 3.infix 实现infix,满足: @infix
竖向列表 @Composable fun MyList(mList: List<String>){ LazyColumn { items(mList.size){ ListItem(mList[it]) } } } @Composable fun ListItem(text: String) { // 构建列表项的 UI Text 横向列表 @Composable fun MyList(mList: List<String>){ LazyRow { items(mList.size){ ListItem(mList[it]) } } } @Composable fun ListItem(text: String) { // 构建列表项的 UI Text { index -> // 在这里构建您的列表项 GridItem(text = mList[index]) } } } @Composable
("home") { Home() } composable("message") { Message() } composable("mine") { Mine() } ("home") { Home() } composable("message") { Message() } composable("mine ("home/{userId}") { Home() } composable("message/{count}") { Message() } composable("mine/{userId ("username") { ... } composable("password") { ... } composable("registration") { ... ("username") { ... } composable("password") { ... } composable("registration") { ...
= null,//提示,有内容时自动缩小并上移 placeholder: @Composable (() -> Unit)? = null,//提示,有内容时自动消失 leadingIcon: @Composable (() -> Unit)? = null,//文本前的图标 trailingIcon: @Composable (() -> Unit)? = null,//文本尾的图标 supportingText: @Composable (() -> Unit)? fun ExtendedFloatingActionButton( text: @Composable () -> Unit,// 文字 icon: @Composable () ->
要使函数成为可组合函数,只需在该函数上方添加 @Composable 注解即可。其实可以直接把被 @Composable 注解的函数看成是一个 View。 其实也很简单,下面是一个例子: // code 10 // 主要方法,被此方法包裹的 Composable 函数都会被设置为自定义主题 @Composable fun CustomTheme( 还有几个值得注意的 Tips: 1、Composable 函数可以按任何顺序执行 如果某个 Composable 函数中包含有几个 Composable 函数,那么这些 Composable 函数可能按任何顺序运行 2、 Composable 函数可以并行运行 Compose 可以通过并行运行 Composable 函数来优化重组。 所以,Compose 可以利用多个核心,并以较低的优先级运行 Composable 函数。因此,Composable 函数可能会在后台线程池中执行。
2、 Composable函数: Compose UI是由一系列@Composable注解的Kotlin函数构成的。这些函数描述UI的组成部分,例如按钮、文本、图标等。 @Composable fun Greeting(name: String) { Text(text = "Hello, $name!") ++ }) { Text("Clicked $count times") } } 4、 组合和重用: 通过将UI拆分为多个@Composable函数,可以实现高度的组合性和重用性 , startDestination) { composable("home") { HomeScreen() } composable("details") { DetailScreen 使用@Preview注解可以看到@Composable函数的即时预览。
可以看到 ComposeUnitTheme 方法中被 @Composable 注解,在 setContent 第二入参中也有 @Composable 注解。 从这里可以看出一点端倪,也许在 Compose 中并没有类似于 Flutter#Widget 的类,对标的是 @Composable 的注解方法。 如下,在调用时可以传入参数,就表明使用 darkTheme ,而且不难分析出 Surface 也是 被 @Composable 标识 的函数。 ? ---- 可以跟进看一下,他是 androidx.compose.material 中提供的 @Composable 方法,它最后的入参仍是 被 @Composable 标识 的函数对象。 所以现在我应该可以把 被 @Composable 标识 的函数 ≈ 组件 了吧。
@OptIn( ExperimentalFoundationApi::class) @Composable fun HomeScreen() { val categories = listOf( @OptIn(ExperimentalMaterial3Api::class) @Composable fun BrowserItem(cat: String, drawable: Int) { @Composable fun SubscriptionScreen() { Column( modifier = Modifier .fillMaxSize @Composable fun LibItem(lib: Lib, onClick: () -> Unit) { Column { Row( modifier 2.4.3 测试UI @Preview(showBackground = true) @Composable fun PreviewMyScreen() { MyScreen() } 2.5 视频演示
可组合:所有 UI 元素都是 @Composable 函数,易于拆分、复用和测试。 Compose 基础入门 认识 @Composable @Composable fun Greeting(name: String) { Text(text = "Hello, $name!") 布局容器 Column:垂直排列 Row:水平排列 Box:堆叠布局 @Composable fun ProfileCard() { Row(modifier = Modifier.padding () LazyColumn { items(list) { TodoItem(it) } } } 布局与主题:打造统一的视觉风格 Material3 主题 @Composable fun MyTheme expanded }) } 智能自动化:让重复工作“自动跑起来” Live Templates 在 IDE 中预设 Compose 代码片段,如 @cmp: @Composable fun $NAME$
这一过程会再次运行相同的 Composable 组件进行更新。 顺带说一下,Compose 首次运行渲染 Composable 组件时,会为所有被调用的 Composable 组件构建一个树,然后在重组期间会使用新的 Composable 组件去更新树。 所以,不要在有添加或移除 Composable 组件的情况下,使用 remember 将重要内容存储在 Composable 组件中,因为添加和移除都会使得数据丢失。 5. 状态提升 状态提升的概念是对于 Composable 组件来说的,根据 Composable 组件中是否含有 State 状态可分为 有状态可组合项 和 无状态可组合项。 有状态可组合项是一种具有可随时间变化状态的 Composable 组件。再说具体一点,就是 Composable 组件里有类似于 remember 存储的状态,而且该组件会在内部保持和改变自己的状态。
fun CkTheme( pallet: ColorPallet = ColorsManager.pallet, content: @Composable() () -> Unit ) 具有层级,它可以被限定在某个 composable 作为根节点的子树中,默认向下传递,同时子树中的某个 composable 也可以对该 CompositionLocal 进行覆盖,然后这个新值就会在这个 composable 中继续向下传递。 composable 即可组合函数,简单理解就是使用了 @Composable 标注的方法。 的 Provider return parentProvider } 用于获取离当前 composable 最近的 CompositionLocalMap 。
@Composable 注解用于标记一个函数为可组合函数。 @Composable 注解的函数之间可以相互调用,因为这样 Compose 框架才能正确处理依赖关系。 另外,@Composable 函数中也可以调用普通函数,而普通函数中却不能直接调用@Composable 函数。 这里可以类比下 kotlin 中 suspend 挂起函数的用法,其用法是相似的。 如果有多个 Composable 函数需要对同一个 State 对象进行写入,那么至少要将 State 提升到所有执行写入的 Composable 函数里调用层级最高的那一层。 AndroidView其实是个 Composable 方法.
@Composable 注解意味着什么? 如果您已经了解过 Compose,您大概已经在一些代码示例中看到过 @Composable 注解。 // 函数声明 @Composable fun MyFun() { … } // lambda 声明 val myLambda = @Composable { … } // 函数类型 fun MyFun (myParam: @Composable () -> Unit) { … } 这里的重点是,当您使用 @Composable 注解一个函数类型时,会导致它类型的改变:未被注解的相同函数类型与注解后的类型互不兼容 fun Example(a: () -> Unit, b: @Composable () -> Unit) { a() // 允许 b() // 不允许 } @Composable fun 存储参数 下面,让我们用 Google Composable 函数来说明 Composable 是如何存储函数的参数的。
对于定制“ViewGroup”的场景,我们应该使用Layout Composable了。首先我们需要创建一个Layout Composable。 Layout Composable使用示例 我们可以通过Layout Composable定制一个自己专属的Column,首先我们需要声明这个Composable。 @Composable fun MyOwnColumn( modifier: Modifier = Modifier, content: @Composable () -> Unit ) @Composable fun MyOwnColumn( modifier: Modifier = Modifier, content: @Composable () -> Unit ) @Composable fun MyOwnColumn( modifier: Modifier = Modifier, content: @Composable () -> Unit )
modifiers-list,这边只介绍常用的 一、Modifier顺序 首先我们必须要知道的是:Modifier的设置是有顺序的,下面的代码分别在设置padding之前和之后为Box设置点击事件: @Preview @Composable = null, onClick: () -> Unit ) 例子: @OptIn(ExperimentalFoundationApi::class) @Preview @Composable fun 例子: @Preview @Composable fun MyRowScope2() { Row(modifier = Modifier.fillMaxSize()) { Text = null ) 例子: @Preview @Composable fun MyPaint() { // 红色画笔 val painter = ColorPainter(Color.Red , ambientShadowColor: Color, spotShadowColor: Color ) 例子: @Preview @Composable fun MyGraphicsLayer
甚至可以说,任何一个Composable函数都应该有一个Modifier参数才对,如果没有的话,那么就说明这个Composable函数写的有问题。 重组其实就是根据当前Compose的代码结构,将一层一层的Composable函数组合成界面的过程。 在Compose的内部,是用树型结构来存储一次重组过程中每个Composable函数节点的。 为Composable函数增加Modifier参数 开篇的时候还提到过,任何一个Composable函数都应该有一个Modifier参数才对,如果没有的话,那么就说明这个Composable函数写的有问题 根据Google官方推荐的Compose编码规范,任何一个Composable函数它的第一个非强制参数都应该是Modifier,就像这样: @Composable fun TestComposable( 这个例子充分展示了拥有Modifier参数的Composable函数具备更高的灵活性,Google提供的所有内置Composable函数都遵循了这个规范,因此希望你也能遵守吧。
spring spring就是一个弹弹乐效果的插值器,stiffness 定义弹簧应向结束值移动的速度,dampingRatio 定义弹簧的弹性,官方给出的效果图示如下: 例子: @Preview @Composable } 效果: 2.tween tween用于指定动画执行时间 durationMillis、延迟执行时间 delayMillis 、运动速率变化 easing 2.1 基本使用 @Preview @Composable )加上可以重复执行的效果,repeatMode 用来指定重复的模式:从头开始 (RepeatMode.Restart) , 从结尾开始 (RepeatMode.Reverse) @Preview @Composable ,可以指定为 EnterTransition.None 和 ExitTransition.None @OptIn(ExperimentalAnimationApi::class) @Preview @Composable = null ) @Preview @Composable fun MyDecayAnimation() { val anim = remember { Animatable(0.dp,