为什么作者需要在 Compose 中一次又一次地传递参数 Modifier ?

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)

Jam*_*rog 6

使用 Jetpack Compose 时,最好尝试创建无状态、可重用的视图。使可组合视图更具可重用性的方法之一是为其提供一个Modifier.

使用代码 B,您现在已经通过DetailsContent在层次结构中的最低视图上定义修饰符元素来确定如何显示。这意味着如果有另一个可组合视图需要DetailsContent以不同的方式使用,则该另一个视图将无法覆盖DetailsContent! (例如,如果另一个视图不需要DetailsContentto该怎么办fillMaxSixe()?

使用代码 A,层次结构中较低的视图从其父级继承修饰符。通过让父级决定如何显示子可组合项的内容,可以实现更大的灵活性和可重用性。

正如此布局 Codelab中所讨论的:

大多数可组合项接受可选的修饰符参数以使它们更加灵活,从而使调用者能够修改它们。如果您要创建自己的可组合项,请考虑使用修饰符作为参数,将其默认为 Modifier (即不执行任何操作的空修饰符)并将其应用于函数的根可组合项。