我们在项目讨论中遇到了一个障碍,即注入的参数修饰符是否应该只影响顶级组件或所有组件。您能提供任何意见吗?
@Composable
fun HomeScreen(
modifier: Modifier = Modifier,
homeViewModel: HomeViewModel = viewModel(),
navigateToGoalReading: () -> Unit,
navigateToDetailEvent: () -> Unit,
) {
val titleTextState by homeViewModel.titleTextState.collectAsState()
val contentTextState by homeViewModel.contentTextState.collectAsState()
val goalBookRead by homeViewModel.goalBookRead.collectAsState()
val readingGoalGraphDataList by homeViewModel.goalReadingGraphDataList.collectAsState()
val bookKingOfTheMonthDataList by homeViewModel.bookKingOfTheMonthDataList.collectAsState()
MindWayAndroidTheme { colors, _ ->
Column(
verticalArrangement = Arrangement.spacedBy(20.dp, Alignment.Top),
horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier
.background(color = colors.WHITE)
.fillMaxSize()
.padding(horizontal = 24.dp)
) {
HomeNoticeCard(
titleText = titleTextState,
content = contentTextState,
onClick = navigateToDetailEvent,
modifier = Modifier
.height(100.dp)
.fillMaxWidth(),
)
HomeGoalReadingChart(
readNumberList = readingGoalGraphDataList,
onClick = navigateToGoalReading,
goalBookRead = goalBookRead,
modifier = Modifier
.fillMaxWidth()
.height(211.dp),
)
HomeReadersOfTheMonthChart(
bookKingOfTheMonthData = bookKingOfTheMonthDataList,
modifier = Modifier
.height(239.dp)
.fillMaxWidth(),
)
}
}
}
VS
@Composable
fun HomeScreen(
modifier: Modifier = Modifier,
homeViewModel: HomeViewModel = viewModel(),
navigateToGoalReading: () -> Unit,
navigateToDetailEvent: () -> Unit,
) {
val titleTextState by homeViewModel.titleTextState.collectAsState()
val contentTextState by homeViewModel.contentTextState.collectAsState()
val goalBookRead by homeViewModel.goalBookRead.collectAsState()
val readingGoalGraphDataList by homeViewModel.goalReadingGraphDataList.collectAsState()
val bookKingOfTheMonthDataList by homeViewModel.bookKingOfTheMonthDataList.collectAsState()
MindWayAndroidTheme { colors, _ ->
Column(
verticalArrangement = Arrangement.spacedBy(20.dp, Alignment.Top),
horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier
.background(color = colors.WHITE)
.fillMaxSize()
.padding(horizontal = 24.dp)
) {
HomeNoticeCard(
titleText = titleTextState,
content = contentTextState,
onClick = navigateToDetailEvent,
modifier = modifier
.height(100.dp)
.fillMaxWidth(),
)
HomeGoalReadingChart(
readNumberList = readingGoalGraphDataList,
onClick = navigateToGoalReading,
goalBookRead = goalBookRead,
modifier = modifier
.fillMaxWidth()
.height(211.dp),
)
HomeReadersOfTheMonthChart(
bookKingOfTheMonthData = bookKingOfTheMonthDataList,
modifier = modifier
.height(239.dp)
.fillMaxWidth(),
)
}
}
}
我已经研究了“now in android”和 Chris Banes 的文章“Always Provide a Modifier parameter”,以及 Google Open Source 的“Jetpack Compose API 指南”,但我找不到令人信服的答案。我非常感谢明确的答案。谢谢你
Modifier
的文档:
因此,根据惯例,您应该将传递到可组合项中的最佳实践是让所有可组合项接受修饰符参数,并将该修饰符传递给其第一个发出 UI 的子项。
Modifier
应用于最顶层的嵌套可组合项,在您的情况下是
Column
。但是,在某些情况下,传入应用于某些嵌套子级的修饰符可能是完全合理的。然后,我建议以不同的方式命名参数(而不是“修饰符”),例如
@Composable
MyComposable(
modifier: Modifier, // Modifier applied to first nested Composable
childModifier: Modifier // Modifier applied to some deeply nested Composable
) {
// ...
}