我正在通过官方教程学习 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
的新实例?
发出 UI1 的所有可组合函数都应采用
Modifier
类型的参数作为其第一个 可选 参数。 可选意味着它有一个默认值,因此当你调用该函数时,你不需要传递这样的参数。
您的示例函数包含单词 modifier 三次,每次都有不同的含义:
fun Greeting(name: String, modifier: Modifier = Modifier)
modifier
。
Modifier
。
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。
仅在第一个元素上使用它,不要在任何其他元素上使用它。