什么时候实例化新的“Modifier”是最佳实践?

问题描述 投票:0回答:1

我正在通过官方教程学习 Jetpack Compose,其中指出:

最佳实践是让您的 Composable 接受 Modifier 参数,并将该修饰符传递给其第一个子项。

并且他们提供了示例,其中

@Composable
函数使用其父级给出的
modifier
参数,将新的修饰符元素链接到它,并将其传递给其子组件。

例如:

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
    Text(
        text = "Hello $name!",
        modifier = modifier.padding(bottom = 16.dp)
    )
}

但是,在提供的解决方案代码中的稍后的练习中,

modifier
参数(带有小写
m
)大部分未使用,而是使用了新的
Modifier
实例(带有大写
M
) 通常使用。

实际上最佳实践是什么?何时使用

modifier
参数,何时创建
Modifier
的新实例?

android android-jetpack-compose
1个回答
0
投票

发出 UI1 的所有可组合函数都应采用

Modifier
类型的参数作为其第一个 可选 参数。 可选意味着它有一个默认值,因此当你调用该函数时,你不需要传递这样的参数。

您的示例函数包含单词

modifier 三次,每次都有不同的含义:

fun Greeting(name: String, modifier: Modifier = Modifier)

    参数的
  1. 名称modifier
  2. 参数
  3. typeModifier
  4. 默认值是
  5. object Modifier
    (当然,还有 
    type Modifier
    )。您可以使用任何其他 Modifier 对象,但对于默认值,您不应该使用它,它应该始终是名为 
    Modifier
     的对象,一个表示空修饰符的全局对象。
现在,在您的可组合项中,您应该使用此

modifier 参数并将其应用到您使用的第一个 UI 元素2

。在您的示例中,这是文本可组合项。它有自己的修饰符参数,其声明方式与您的 Greeting 函数的声明方式相同。
在您的示例中,您不仅将 modifier

参数传递给 Text,还首先添加另一个修饰符,从而有效地创建

修饰符链

:
Text( text = "Hello $name!", modifier = modifier.padding(bottom = 16.dp) )

但是你也可以简单地传递参数:
Text(
    text = "Hello $name!",
    modifier = modifier
)

(其中第一个单词
modifier
是Text的参数名称,第二个是传递给Greeting的实际修饰符对象)

也可以

使用这个(大写

M):

Text(
    text = "Hello $name!",
    modifier = Modifier
)

它编译得很好,但现在您不再使用传递给 Greeting 的
modifier
参数,而是使用全局

Modifier

 对象。由于它与 Text 声明的默认值相同,因此您可以完全省略它:
Text(
    text = "Hello $name!"
)

结论:当您想要使用传递给函数的实际对象(它可能包含任何修饰符或修饰符链)时,请使用
modifier
。当您想要访问空的全局修饰符并且实际上不修改任何内容时,请使用

Modifier

。您主要将其用作默认值或修饰符链的起点。

1
这是诸如“列”、“文本”之类的可组合项或您将创建的大多数自定义可组合项,但

不是 remember 等;它们是可组合函数,但不发出 UI。

2

在第一个元素上使用它,不要在任何其他元素上使用它。

© www.soinside.com 2019 - 2024. All rights reserved.