我们在项目讨论中遇到了一个障碍,即注入的参数修改器是否应该仅影响顶级组件还是所有组件.您能提供任何意见吗?

@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的API Guidelines for Jetpack Compose,但我找不到令人信服的答案.我将非常感谢明确的答案.

推荐答案

请查看有关Modifier的文档:

最佳实践是让所有合成物接受修饰符参数和pass that modifier to its first child that emits UI.

因此,根据惯例,您应该将传递到Composable中的Modifier应用于最上面的嵌套Composable,在您的情况下是Column.

然而,在某些情况下,传递应用于某些嵌套子项的修饰符可能是完全合理的.然后我建议以不同的方式命名参数(而不是"修饰符"),例如

@Composable
MyComposable(
    modifier: Modifier,        // Modifier applied to first nested Composable
    childModifier: Modifier    // Modifier applied to some deeply nested Composable
) {
    
    Column(
        modifier = modifier.fillMaxWidth()
    ) {
        Text(
            modifier = childModifier,
            text = "Hello World"
        )
    }

}

Android相关问答推荐

Android Studio -未显示布局预览(不推荐使用安全管理器)

我如何剪裁一个可由另一个合成的

LocalContext.current的问题(@Composable调用只能从@Composable函数的上下文发生)

每次重启Android时预填入Room数据库

Play Google上发布的一款应用的房间数据库迁移

设置文本 colored颜色 动画时如何减少重新组合?

仅当先前输入为 yes 时,Android 才会要求下一个输入

FFmpeg Android 错误

闪屏 API 无法在 Android 12 上运行(API 31、32)

@Immutable 对数据类有什么好处?

在 Kotlin 中设置 startActivity() 时类型不匹配

组成不重叠的元素

PullRefreshIndicator 与 ScrollableTabRow 重叠

Jetpack 组合千位分隔符视觉转换,也适用于小数

如何在jetpack compose中通过lamda返回columnScope/RowScope

如何关闭可组合对话框?

将房间中的实体更新为 isCompleted 并使用 Flow 问题获取所有数据

android 13 版本是否会影响 android 12 目标应用程序

如何将房间数据库导出到 .CSV

我的自定义视图没有显示我应该如何修复它?