• 如何优雅的在Column中嵌入横向滚动的 ListView


    example:有一个需求是多个横向滚动的列表纵向排列在一个界面中。

    我们直接写,在Column 中直接加上 ListView

    class TextPage extends StatelessWidget {
      const TextPage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Column(children: [
          ListView.builder(
            scrollDirection: Axis.horizontal,
            itemCount: 100,
            itemBuilder: (BuildContext context, int index) {
              return Item();
            },
          ),
        ],);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    当当当,恭喜你,喜提报错:

    在这里插入图片描述

    vertical space in which to expand.
    解决这个问题,我们通常都会在 ListView 外面添加一个SizedBox 来约束ListView。

    SizedBox(
      height: 100.w,
      child: ListView.builder(
        scrollDirection: Axis.horizontal,
        itemCount: 100,
        itemBuilder: (BuildContext context, int index) {
          return Item();
        },
      ),
    ),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    但是! 这这样的写法并不是那么优雅。会在特定情况下出现一出BUG。

    当调节手机字体大小的时候,就会导致Item 组件中的字体大小高度发生变化,但是我们约束 ListView 的 SizedBox 的高度是固定的,就会出现溢出报错。

    在这里插入图片描述

    可能会有人说 可以用 IntrinsicHeight 包裹。但是 ListView 是懒加载的。所以 IntrinsicHeight 不能获取所有的Item的高度。如果Item的高度会变化呢。

    itemBuilder: (BuildContext context, int index) {
      if(index > 10){
        return Container(height: 400,width: 200,color: Colors.pink,);
      }
      return Item();
    },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上一张图片中,两个同样的ListView 同样的Item。
    为什么下面的 ListView 就会根据Item自适应高度。但是上面的就会溢出报错。
    这就是今天要讲的优雅的是向 Column 嵌入横向 ListView。
    废话不多说直接上代码:

    Stack(
      children: [
        const IgnorePointer(
          child: Opacity(
            opacity: 0,
            child: Item(),
          ),
        ),
        const SizedBox(width: double.infinity),
        Positioned.fill(
            child: ListView.builder(
          itemCount: 100,
          scrollDirection: Axis.horizontal,
          itemBuilder: (BuildContext context, int index) {
            return Item();
          },
        )),
      ],
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    解析:
    这里用了Stack 的特性。 Stack 的高度会根据 其子组件中 非Positioned组件的最大高度来自撑开的。

  • 相关阅读:
    【OAuth2】十九、OpenID Connect 动态客户端注册
    Centos7安装mysql(只需六步)
    Nacos源码分析专题(一)-环境准备
    数据化运营13 工具与方法:如何运用 3A3R 模型将数据转化为运营策略
    ElasticSearch--配置--大全/详解
    【linux】Linux第一个小程序-进度条
    Python中的函数未定义的错误
    【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南
    电力安全智慧云平台:引领更安全的用电新时
    图解路由协议!
  • 原文地址:https://blog.csdn.net/Cang_Ye/article/details/127547819