Compose从alpha02升级到alpha06后Column设置weight(1f)报错问题
解决Jetpack Compose alpha06中Column无法设置weight的问题
我刚帮你梳理清楚了这个问题的根源:在Compose从alpha02升级到alpha06的过程中,weight修饰符的使用规则被明确约束了——它是Row/Column直接子项的专属修饰符,不能在子组件内部的Column上直接硬编码添加。咱们可以通过两步调整来解决:
1. 调整组件定义,开放Modifier传入权限
首先修改你的SettingsGraphicSelectComposeView,不要在内部的Column上固定添加weight,而是让组件接收外部传入的Modifier并应用到根布局上,这样布局控制权就交给了组件的调用方:
@Composable fun SettingsGraphicSelectComposeView( modifier: Modifier = Modifier, // 保留外部传入Modifier的入口 textStyles: TextStyles = KoinJavaComponent.inject(TextStyles::class.java).value, viewModel: ItemViewModel.GraphicSelect ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, modifier = modifier // 直接使用外部传入的Modifier,不再硬加weight ) { Image( asset = vectorResource(id = viewModel.imageId) ) Text( modifier = Modifier // 这里不要复用外部modifier,避免把weight等修饰符意外应用到Text上 .padding( start = dimensionResource(id = R.dimen.spacingL), top = dimensionResource(id = R.dimen.spacingL), end = dimensionResource(id = R.dimen.spacingL), bottom = dimensionResource(id = R.dimen.spacingS) ), text = viewModel.caption, style = textStyles.TitleSmall.merge(TextStyle(color = colorResource(id = R.color.tint_secondary))) ) RadioButton( selected = viewModel.selected, onClick = viewModel.action, colors = RadioButtonConstants.defaultColors( selectedColor = colorResource(R.color.brand), unselectedColor = colorResource(R.color.tint_secondary) ) ) } }
2. 在组件调用处添加weight修饰符
接下来在使用SettingsGraphicSelectComposeView的地方,给每个组件添加Modifier.weight(1f),同时要确保它们所在的Row设置了fillMaxWidth(让Row占据全部可用宽度,weight才能生效):
Surface(color = colorResource(id = R.color.background)) { Column( modifier = Modifier .fillMaxHeight() ) { items.value?.let { items -> val switchers = items.filter { it.viewModel is ItemViewModel.Switcher } val graphicSelects = items.filter { it.viewModel is ItemViewModel.GraphicSelect } if (switchers.isNotEmpty()) { val autoSwitcher = switchers[0] SettingsSwitcherComposeView(viewModel = autoSwitcher.viewModel as ItemViewModel.Switcher) } Row( modifier = Modifier .padding(horizontal = dimensionResource(id = R.dimen.spacing2XL)) ) { if (graphicSelects.size > 1) { val lightSelector = graphicSelects[0] val darkSelector = graphicSelects[1] Row( modifier = Modifier .fillMaxWidth() // 新增:让Row占据全部可用宽度,weight才有作用空间 .border( width = 1.dp, color = colorResource(R.color.highlight), shape = RoundedCornerShape( dimensionResource(R.dimen.content_corner_radius) ) ) .padding(vertical = dimensionResource(id = R.dimen.spacing2XL)) ) { // 给第一个选择器添加weight=1f SettingsGraphicSelectComposeView( modifier = Modifier.weight(1f), viewModel = lightSelector.viewModel as ItemViewModel.GraphicSelect ) Spacer( modifier = Modifier .width(1.dp) // alpha06中preferredWidth已替换为width .height(160.dp) // preferredHeight替换为height .background(color = colorResource(R.color.highlight)) ) // 给第二个选择器添加weight=1f SettingsGraphicSelectComposeView( modifier = Modifier.weight(1f), viewModel = darkSelector.viewModel as ItemViewModel.GraphicSelect ) } } } } } }
额外提醒:alpha06版本中
preferredWidth和preferredHeight已被废弃,我顺便帮你替换成了新的width和heightAPI,避免编译警告。
这样修改后,两个SettingsGraphicSelectComposeView就会在Row中均匀分配可用宽度,完美实现你想要的布局效果。
内容的提问来源于stack exchange,提问作者Ambran
相关产品推荐
相关产品推荐

