flutter Column嵌套ListView高度自适应问题

1.限制最大高度500,当布局高度小于500时高度自适应包裹

//当布局外不需要包裹Container时,使用ConstrainedBox(constraints: BoxConstraints(maxHeight: 500,minHeight: 0),child: Column())
_body(){
    return Container(
        constraints: BoxConstraints(maxHeight: 500,minHeight: 0),
        decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(10)
        ),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            SizedBox(height: 40.w),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                Container(width: 10),
                Expanded(
                    child: Text(
                      '选择二维码',
                      style: TextStyle(
                        fontSize: 30.sp,
                        color: JadeColors.grey_2,
                        fontWeight: FontWeight.w600,
                      ),
                      textAlign: TextAlign.center,
                    )),
                GestureDetector(
                  child: Container(
                    color: Colors.transparent,
                    padding: EdgeInsets.all(4),
                    margin: EdgeInsets.only(right: 20.w),
                    child: Image.asset(PathConfig.iconCloseWhite, width: 36.w, height: 36.w),
                  ),
                  onTap: () {
                    NavigatorUtil.pop();
                  },
                )
              ],
            ),
            Padding(padding: EdgeInsets.only(top: 20.w),
                child: Text('因阿推秀格口较多,请分批生成下载。',style: TextStyle(color: JadeColors.grey,fontSize: 24.sp))),
            Flexible(child: _listView())//Flexible灵活分配空间,未设置flex时默认尽可能小地包裹其内容
          ],
        )
        ,
      );
  }

  _listView(){
    return Padding(padding: EdgeInsets.only(left: 50.w,right: 50.w,top: 30.w),
    child: ScrollConfiguration(
    behavior: CusBehavior(),
    child: ListView.builder(
        shrinkWrap: true,
        itemBuilder: (_,index){
          return _itemButton(index);
        },itemCount: _testList.length))
    );
  }

  _itemButton(index){
    return Container(
      height: 170.w, width: double.infinity,
      padding: EdgeInsets.symmetric(horizontal: 40.w),
      margin: EdgeInsets.only(top: 20.w,bottom: index == _testList.length -1 ? 120.w : 0),
      decoration: BoxDecoration(color: JadeColors.grey_14, borderRadius: BorderRadius.circular(10)),
      child: Row(
        children: [
          Expanded(child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('标题',style: TextStyle(fontSize: 32.sp,fontWeight: FontWeight.w600)),
              Text('描述',style: TextStyle(fontSize: 22.sp,fontWeight: FontWeight.w300,color: JadeColors.grey_3))
            ],)),
          GestureDetector(
            onTap: (){},
            child: Container(
              padding: EdgeInsets.symmetric(horizontal: 40.w,vertical: 15.w),
              decoration: BoxDecoration(
                  color: JadeColors.blue_30,
                  borderRadius: BorderRadius.circular(30),
                border: Border.all(color: JadeColors.blue_29)
              ),
              child: Text('查看',style: TextStyle(color: JadeColors.blue_2,fontSize: 24.sp),),
            ),
          )
        ],
      ),
    );
  }

2.限制布局最小高度50,当布局高度大于50时高度自适应包裹

ConstrainedBox(constraints: BoxConstraints(minHeight: 50,
child: Column(
mainAxisSize: MainAxisSize.min,//设置布局内容尽可能小
children: [
///
]
))
### 解决方案 在 Flutter 中,`ListView` 嵌套可能会导致 `easy_refresh` 插件的下拉刷新功能被误触发。这是因为外层和内层的滚动视图可能同时响应用户的滑动手势[^2]。 为了避免这种情况的发生,可以通过禁用内部 `ListView` 的滚动行为来解决问题。具体来说,设置 `physics: NeverScrollablePhysics()` 可以让内部的 `ListView` 不再独立处理滑动事件,从而避免与外部的 `easy_refresh` 发生冲突。 以下是完整的解决方案代码: ```dart import 'package:flutter/material.dart'; import 'package:easy_refresh/easy_refresh.dart'; class NestedListExample extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: EasyRefresh( onRefresh: () async { // 处理下拉刷新逻辑 await Future.delayed(Duration(seconds: 2)); }, onLoad: () async { // 处理上拉加载更多逻辑 await Future.delayed(Duration(seconds: 2)); }, child: ListView.builder( itemCount: 3, // 假设有三个子列表 itemBuilder: (context, index) { return Container( height: 200, child: ListView.builder( physics: NeverScrollablePhysics(), // 关键:禁用内部 ListView 滚动 shrinkWrap: true, // 自适应高度 itemCount: 10, itemBuilder: (context, subIndex) { return ListTile( title: Text('Item $subIndex in List $index'), ); }, ), ); }, ), ), ); } } ``` 上述代码通过以下方式解决了嵌套问题: - 设置 `NeverScrollablePhysics()` 来禁用内部 `ListView` 的滚动能力。 - 使用 `shrinkWrap: true` 让内部 `ListView` 能够自动调整其大小,以便更好地适配父级容器的高度。 此外,如果需要更复杂的交互体验或者自定义样式,可以参考 `easy_refresh` 提供的内置样式或创建自己的样式[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值