Flutter使用SingleChildScrollView让Column与ListView.builder可滚动及报错处理
问题原因
RenderFlex children have non-zero flex but incoming height constraints are unbounded报错的核心逻辑是:SingleChildScrollView本身不会给子组件施加高度约束,内部的Column高度完全由子组件总高度决定,而Expanded要求父组件必须有明确的高度边界才能分配剩余空间,二者逻辑冲突。- 同时你嵌套了两个垂直滚动组件(SingleChildScrollView + ListView.builder),默认状态下二者会争抢滚动事件,也无法实现整体滚动的需求。
修复方案
只需要修改ListView.builder的外层和配置即可,具体改动点:
- 删除包裹ListView.builder的
Expanded组件 - 给ListView.builder添加两个配置参数:
shrinkWrap: true:让ListView只占用自身子项总高度,而非尽可能占满父组件高度physics: const NeverScrollableScrollPhysics():禁用ListView自身的滚动能力,所有滚动事件都交给外层的SingleChildScrollView处理
修改后的完整代码
import 'package:flutter/material.dart'; import 'package:ionicons/ionicons.dart'; import 'package:provider/provider.dart'; import '../widgets/product_item.dart'; import '../providers/products.dart'; class ProductsOverviewScreen extends StatelessWidget { const ProductsOverviewScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final productsData = Provider.of<Products>(context); final products = productsData.items; return Scaffold( appBar: AppBar( leading: IconButton( onPressed: () {}, icon: const Icon( Ionicons.notifications_outline, ), ), title: SizedBox( width: MediaQuery.of(context).size.width * 0.3, height: MediaQuery.of(context).size.height * 0.1, child: Image.asset( 'assets/logo.png', fit: BoxFit.contain, ), ), actions: [ IconButton( onPressed: () {}, icon: const Icon( Ionicons.cart_outline, ), ), ], ), body: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ Container( height: 140, width: MediaQuery.of(context).size.width * 0.9, decoration: BoxDecoration( borderRadius: BorderRadius.circular(26.0), color: Colors.grey[300], ), ), Row( children: const [ Padding( padding: EdgeInsets.only( left: 15.0, top: 20.0, ), child: Text( 'Place Order', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18.0, ), ), ), ], ), ListView.builder( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), scrollDirection: Axis.vertical, itemCount: products.length, itemBuilder: (ctx, i) => ProductItem( products[i].id, products[i].name, products[i].size, products[i].price, products[i].image, ), ) ], ), ), ); } }
内容的提问来源于stack exchange,提问作者supremo
相关产品推荐
相关产品推荐

