JetPack Compose使用Modifier.weight报错:无法访问RowScopeInstance
解决Jetpack Compose中Modifier.weight报错及布局占比问题
问题根源
- 导入冲突:代码同时引入了Compose的
Row和Leanback库的Row,导致布局作用域混乱,触发RowScopeInstance访问错误。 - weight使用场景错误:
Modifier.weight是Row/Column作用域的扩展函数,不能在独立Composable内部直接调用,需在父布局的子元素层级设置。 - 布局结构不符合需求:要实现上下区域各占屏幕一半,外层需用Column包裹两个Row,而非直接并列放置Row。
修正后的完整代码
import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.quadrantcompose.ui.theme.QuadrantComposeTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { QuadrantComposeTheme { Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { Quadrant() } } } } } @Composable fun Case(title: String, description: String, modifier: Modifier = Modifier){ Column( modifier = modifier .padding(16.dp) .fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = title, fontWeight = FontWeight.Bold, modifier = Modifier.padding(bottom = 8.dp) ) Text( text = description, textAlign = TextAlign.Justify ) } } @Composable fun Quadrant(modifier: Modifier = Modifier) { // 外层Column实现上下两个Row各占一半高度 Column(modifier = modifier.fillMaxSize()) { // 第一个Row占屏幕高度的一半 Row( modifier = Modifier .fillMaxWidth() .weight(1f) ) { Case( "Text composable", "Displays text and follows the recommended Material Design guidelines.", modifier = Modifier .background(Color(0xFFEADDFF)) .weight(1f) // 平分当前Row的宽度 ) Case( "Image composable", "Creates a composable that lays out and draws a given Painter class object.", modifier = Modifier .background(Color(0xFFD0BCFF)) .weight(1f) ) } // 第二个Row占屏幕高度的另一半 Row( modifier = Modifier .fillMaxWidth() .weight(1f) ) { Case( "Row composable", "A layout composable that places its children in a horizontal sequence.", modifier = Modifier .background(Color(0xFFB69DF8)) .weight(1f) ) Case( "Column composable", "A layout composable that places its children in a vertical sequence.", modifier = Modifier .background(Color(0xFFF6EDFF)) .weight(1f) ) } } } @Preview(showBackground = true) @Composable fun QuadrantPreview() { Quadrant() }
关键修改说明
- 移除冲突导入:删除
import androidx.leanback.widget.Row,确保使用Compose官方的Row组件。 - 重构布局结构:用外层Column包裹两个Row,给每个Row添加
Modifier.weight(1f),实现上下区域各占屏幕一半高度。 - 正确使用weight:在Row的直接子元素(Case组件)上设置
weight(1f),让两个Case平分所在Row的宽度;将weight从Case内部移到父布局调用时传入,符合Compose的作用域规则。 - 优化视觉效果:给Case添加padding、居中对齐等修饰,提升界面可读性。
内容的提问来源于stack exchange,提问作者kasimaru13
相关产品推荐
相关产品推荐

