Hel*_*oCW 4 kotlin android-jetpack-compose
以下代码A来自官方示例项目。
在代码 A 中,参数Modifier在函数之间反复传递。
我不太明白为什么作者需要设计Modifier一次又一次地在函数之间传递参数。
我认为代码B很简单。Code A的设计框架会得到什么好处?
代码A
@AndroidEntryPoint
class DetailsActivity : ComponentActivity() {
...
DetailsScreen(
onErrorLoading = { finish() },
modifier = Modifier
.statusBarsPadding()
.navigationBarsPadding()
)
...
}
@Composable
fun DetailsScreen(
onErrorLoading: () -> Unit,
modifier: Modifier = Modifier,
viewModel: DetailsViewModel = viewModel()
) {
...
DetailsContent(cityDetails.data, modifier.fillMaxSize())
..
}
@Composable
fun DetailsContent(
exploreModel: ExploreModel,
modifier: Modifier = Modifier
) {
Column(modifier = modifier, verticalArrangement = Arrangement.Center) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
代码B
@AndroidEntryPoint
class DetailsActivity : ComponentActivity() {
...
DetailsScreen(
onErrorLoading = { finish() }
)
...
}
@Composable
fun DetailsScreen(
onErrorLoading: () -> Unit,
viewModel: DetailsViewModel = viewModel()
) {
...
DetailsContent(cityDetails.data)
..
}
@Composable
fun DetailsContent(
exploreModel: ExploreModel
) {
val modifier = Modifier
.statusBarsPadding()
.navigationBarsPadding()
.fillMaxSize()
Column(modifier = modifier, verticalArrangement = Arrangement.Center) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
使用 Jetpack Compose 时,最好尝试创建无状态、可重用的视图。使可组合视图更具可重用性的方法之一是为其提供一个Modifier.
使用代码 B,您现在已经通过DetailsContent在层次结构中的最低视图上定义修饰符元素来确定如何显示。这意味着如果有另一个可组合视图需要DetailsContent以不同的方式使用,则该另一个视图将无法覆盖DetailsContent! (例如,如果另一个视图不需要DetailsContentto该怎么办fillMaxSixe()?)
使用代码 A,层次结构中较低的视图从其父级继承修饰符。通过让父级决定如何显示子可组合项的内容,可以实现更大的灵活性和可重用性。
正如此布局 Codelab中所讨论的:
大多数可组合项接受可选的修饰符参数以使它们更加灵活,从而使调用者能够修改它们。如果您要创建自己的可组合项,请考虑使用修饰符作为参数,将其默认为 Modifier (即不执行任何操作的空修饰符)并将其应用于函数的根可组合项。
| 归档时间: |
|
| 查看次数: |
1710 次 |
| 最近记录: |