Flutter应用中ParentDataWidget使用错误问题排查
解决「Incorrect use of ParentDataWidget」异常
问题原因
异常提示明确指出:Expanded组件必须直接嵌套在Flex(Row/Column/Flex)组件内,但你的CartItem组件中,Expanded被放在了Dismissible组件内部,而Dismissible不属于Flex类组件,这就违反了Expanded的使用规则。
解决方案
移除CartItem中Dismissible的child属性里的Expanded组件,直接将Card作为Dismissible的子组件即可。因为ListView的item本身会自适应空间,不需要用Expanded来强制扩展。
修改后的CartItem代码
class CartItem extends StatelessWidget { final String id; final String productId; final double price; final int quantity; final String title; CartItem( this.id, this.productId, this.price, this.quantity, this.title, ); @override Widget build(BuildContext context) { return Dismissible( key: ValueKey(id), background: Container( // color: Theme.of(context).colorScheme.primary, child: Icon( Icons.delete, color: Colors.white, size: 40, ), alignment: Alignment.centerRight, padding: EdgeInsets.only(right: 20), margin: EdgeInsets.symmetric( horizontal: 15, vertical: 4, ), ), direction: DismissDirection.endToStart, onDismissed: (direction) { Provider.of<Cart>(context, listen: false).removeItem(productId); }, // 移除Expanded,直接使用Card作为子组件 child: Card( margin: EdgeInsets.symmetric( horizontal: 15, vertical: 4, ), child: Padding( padding: EdgeInsets.all(8), child: ListTile( leading: CircleAvatar( radius: 30, backgroundColor: Theme.of(context).colorScheme.primary, child: Padding( padding: EdgeInsets.all(5), child: FittedBox( child: Text( '\$$price', style: TextStyle(fontWeight: FontWeight.w900), ), ), ), ), title: Text( title, style: TextStyle(fontWeight: FontWeight.bold), ), subtitle: Text('Total: \$${(price * quantity)}'), trailing: Text('$quantity x'), ), ), ), ); } }
补充说明
Expanded的作用是在Flex布局中分配剩余空间,它依赖父组件提供的Flex布局约束。当父组件不是Flex类组件时,Expanded无法获取到所需的约束条件,就会触发这个异常。你的场景中,CartItem作为ListView的item,本身会被ListView管理空间,不需要额外的Expanded来控制尺寸。
内容的提问来源于stack exchange,提问作者GoodMan
相关产品推荐
相关产品推荐

