嵌套带verticalScroll的Column中的LazyColumn抛出异常,如何解决?
问题
在Composable组件中,我将LazyColumn嵌套在Column内部,期望Column与LazyColumn一同实现整体滚动,但为Column添加verticalScroll修饰符后应用崩溃,抛出以下异常:
异常信息
java.lang.IllegalStateException: Vertically scrollable component was measured with an infinity maximum height constraints, which is disallowed. One of the common reasons is nesting layouts like LazyColumn and Column(Modifier.verticalScroll()).
相关Composable代码
Column( modifier = Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()) .padding(bottom = 100.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { LazyColumn( modifier = Modifier .fillMaxWidth() ) { items( items = allItems!!, key = { item -> item.id } ) { item -> ShoppingListScreenItem( navController = navController, item = item, sharedViewModel = sharedViewModel ) { isChecked -> scope.launch { shoppingListScreenViewModel.changeItemChecked(item!!, isChecked) } } } } ... Button( modifier = Modifier.padding(vertical = 24.dp), onClick = { navController.navigate(NavScreens.AddItemScreen.route) { popUpTo(NavScreens.AddItemScreen.route) { inclusive = true } } } ) { Text("Go to add item screen") } }
解决方案
崩溃核心原因:添加了verticalScroll的Column会给子组件传递无限高度约束,而LazyColumn作为可滚动组件,必须基于有限高度约束才能完成布局测量,两者冲突触发异常。
方法1:将所有内容合并到单个LazyColumn中(推荐)
LazyColumn支持通过item()添加单个组件、items()添加批量列表项,把原本Column中的所有内容(包括按钮)都放到同一个LazyColumn里,即可实现整体滚动。修改后的代码如下:
LazyColumn( modifier = Modifier .fillMaxWidth() .padding(bottom = 100.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { // 原LazyColumn中的列表项 items( items = allItems!!, key = { item -> item.id } ) { item -> ShoppingListScreenItem( navController = navController, item = item, sharedViewModel = sharedViewModel ) { isChecked -> scope.launch { shoppingListScreenViewModel.changeItemChecked(item!!, isChecked) } } } // 原Column中的按钮组件 item { Button( modifier = Modifier.padding(vertical = 24.dp), onClick = { navController.navigate(NavScreens.AddItemScreen.route) { popUpTo(NavScreens.AddItemScreen.route) { inclusive = true } } } ) { Text("Go to add item screen") } } }
方法2:为嵌套的LazyColumn设置固定高度(不推荐)
如果必须保留Column结构,可以给内部的LazyColumn指定固定高度,让它在有限空间内独立滚动,但这种方式会出现局部滚动,不符合整体滚动的需求,仅适合特殊场景:
Column( modifier = Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()) .padding(bottom = 100.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { LazyColumn( modifier = Modifier .fillMaxWidth() .height(300.dp) // 指定固定高度 ) { // 列表项内容不变 } // 按钮内容不变 }
内容的提问来源于stack exchange,提问作者Raj Narayanan
相关产品推荐
相关产品推荐

