首页 > 其他分享 >flutter 中scrollable_positioned_list 控制列表滚动

flutter 中scrollable_positioned_list 控制列表滚动

时间:2024-08-10 18:40:16浏览次数:10  
标签:scrollable 滚动 index positioned list 列表 child 文本 itemScrollController

scrollable_positioned_list 是 Flutter 中一个强大的列表控件,它允许通过位置来控制列表滚动。它常用于需要精确控制列表滚动位置的应用场景

依赖

 scrollable_positioned_list: ^0.3.8 #精确控制列表滚动位置

代码

提前知道每个模块高度

class MyList extends StatefulWidget {
  @override
  _MyListState createState() => _MyListState();
}

class _MyListState extends State<MyList> {
  // 控制列表滚动的控制器
  final ItemScrollController _itemScrollController = ItemScrollController();
  
  // 每个列表项的高度列表,生成了 100 个项,高度范围从 50 到 500
  final List<double> _itemHeights = List.generate(100, (index) => (index % 10 + 1) * 50.0);
  
  // 存储每个列表项的累计高度
  final List<double> _cumulativeHeights = [];

  @override
  void initState() {
    super.initState();
    _calculateCumulativeHeights();
  }
  // 计算每个列表项的累计高度
  void _calculateCumulativeHeights() {
    double totalHeight = 0.0; // 用于累计高度的变量
    _cumulativeHeights.clear(); // 清空之前计算的高度
    for (var height in _itemHeights) {
      totalHeight += height; // 更新累计高度
      _cumulativeHeights.add(totalHeight); // 添加到累计高度列表
    }
  }
 // 滚动到指定的索引
  void _scrollToIndex(int index) {
     // 索引必须在合法范围内
    if (index < 0 || index >= _cumulativeHeights.length) return;
    // 使用 ItemScrollController 滚动到指定索引
    _itemScrollController.scrollTo(
      index: index, // 要滚动到的项的索引
      duration: Duration(seconds: 1), // 滚动动画的持续时间
      curve: Curves.easeInOut, // 滚动动画的曲线
    );
    // _itemScrollController.jumpTo(index: index); //直接跳转
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          onPressed: () => _scrollToIndex(10),
          child: Text('Scroll to Item 10'),
        ),
        Expanded(
          child: ScrollablePositionedList.builder(
            itemCount: 100,
            itemScrollController: _itemScrollController,
            itemBuilder: (context, index) {
              return Container(
                height: _itemHeights[index],// 每项的高度来自 _itemHeights 列表
                color: index.isEven ? Colors.blue : Colors.green,
                child: Center(
                  child: Text('Item $index', style: TextStyle(color: Colors.white)),
                ),
              );
            },
          ),
        ),
      ],
    );
  }
}

文字宽度不确定

class _MyListState extends State<MyList> {
  // 控制列表滚动的控制器
  final ItemScrollController _itemScrollController = ItemScrollController();

  // 每个列表项的文本
  final List<String> _items =
      List.generate(100, (index) => 'Item $index' + '数' * index);
  // 存储每个列表项的宽度
  final List<double> _itemWidths = [];

  @override
  void initState() {
    super.initState();
    // 初始化时计算每个项的宽度
    _calculateItemWidths();
  }

  // 计算每个列表项的宽度
  void _calculateItemWidths() {
    // 清空之前计算的宽度
    _itemWidths.clear();

    // 创建一个 TextPainter 实例来计算文本的宽度
    final textPainter = TextPainter(
      textDirection: TextDirection.ltr, // 设置文本的方向为从左到右
    );

    // 遍历每个 item 以计算其宽度
    for (var item in _items) {
      // 设置 TextSpan,定义要计算的文本及其样式
      textPainter.text = TextSpan(
        text: item, // 需要测量的文本内容
        style: TextStyle(fontSize: 30), // 设置文本的样式,这里是字体大小为 30
      );

      // 布局计算文本的实际宽度
      textPainter.layout();

      // 计算文本宽度,并加上额外的 20 像素的边距
      // 这个边距通常用于保证文本不紧贴容器的边缘
      _itemWidths.add(textPainter.width + 20);
    }
  }

  // 滚动到指定的索引
  void _scrollToIndex(int index) {
    // 索引必须在合法范围内
    if (index < 0 || index >= _itemWidths.length) return;
    // 使用 ItemScrollController 滚动到指定索引
    _itemScrollController.scrollTo(
      index: index, // 要滚动到的项的索引
      duration: Duration(seconds: 1), // 滚动动画的持续时间
      curve: Curves.easeInOut, // 滚动动画的曲线
    );
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 按钮点击后滚动到列表中的第 10 项
        ElevatedButton(
          onPressed: () => _scrollToIndex(10), // 按钮点击事件,滚动到第 10 项
          child: Text('Scroll to Item 10'), // 按钮文本
        ),
        Expanded(
          child: ScrollablePositionedList.builder(
            scrollDirection: Axis.horizontal, // 设置为横向滚动
            itemCount: _items.length, // 列表项的总数
            itemScrollController: _itemScrollController, // 绑定滚动控制器
            itemBuilder: (context, index) {
              // 创建每个列表项
              return Container(
                width: _itemWidths[index], // 每项的宽度来自 _itemWidths 列表
                margin: EdgeInsets.symmetric(horizontal: 8), // 每项之间的水平间距
                color:
                    index.isEven ? Colors.blue : Colors.green, // 根据索引的奇偶性设置背景颜色
                child: Center(
                  child: Text(
                    _items[index],
                    style: TextStyle(color: Colors.white), // 列表项的文本内容和样式
                  ),
                ),
              );
            },
          ),
        ),
      ],
    );
  }
}

 

标签:scrollable,滚动,index,positioned,list,列表,child,文本,itemScrollController
From: https://www.cnblogs.com/xbinbin/p/18352615

相关文章

  • TypeError: ‘list’ object is not callable 深度解析
    TypeError:‘list’objectisnotcallable深度解析概述:在Python编程中,遇到“TypeError:‘list’objectisnotcallable”这一错误通常意味着你尝试以函数或方法的方式调用了一个列表对象。这种错误往往是由于编码疏忽或理解偏差导致的。本文将深度解析这一......
  • AttributeError: ‘list’ object has no attribute ‘append’
    AttributeError:‘list’objecthasnoattribute‘append’深度解析与实战指南概述:在Python编程中,AttributeError是一个常见的错误类型,它表明尝试访问或调用一个对象的属性或方法时失败了,因为该对象并没有这样的属性或方法。当你看到错误信息“Attrib......
  • List集合及List的专有迭代器 day12
    packagecom.shujia.day12;importjava.util.ArrayList;importjava.util.List;importjava.util.ListIterator;/*Collection的子接口:List特点:有序且元素可以发生重复的集合,且有索引下标的概念。*//*List接口中特有的成员方法:(因为List集合有索引的概......
  • Ruoyi-Cloud 启动失败的坑,关于 selectConfigList
    刚才编辑了一堆,不知道为啥加了个英文单词,当前页面刷新自动搜索了单词,之前的内容总的就是现在都要会SpringCloud,高并发,几个真正懂高并发的,问题一般项目也没有啥高并发。自己之前的项目遇到过高并发,单体服务Tomcat最大连接数在那摆着设置再高没有用,打开后台一看OOM一直跳,重......
  • Windows图形界面(GUI)-MFC-C/C++ - 列表视图(List Control) - CListCtrl
    公开视频-> 链接点击跳转公开课程博客首页-> ​​​链接点击跳转博客主页目录列表视图(ListControl)-CListCtrl创建列表视图设置列表视图属性成员函数注意事项示例代码列表视图(ListControl)-CListCtrl创建列表视图在对话框编辑器中,从工具箱中拖拽一个Li......
  • ServletContextListener监听常用场景
    ServletContextListener是JavaEE中的一个接口,用于监听ServletContext生命周期的变化。通过实现这个接口,你可以在Web应用启动或关闭时执行一些初始化或清理操作。ServletContextListener是JavaWeb开发中一种重要的监听器,它用于监听ServletContext对象的创建和......
  • 浙大数据结构慕课课后题(03-树2 List Leaves)
    题目要求:给定一棵树,您应该按照从上到下、从左到右的顺序列出所有叶子。输入规格: 每个输入文件都包含一个测试用例。对于每种情况,第一行都给出一个正整数N(<=10),这是树中节点的总数--因此节点的编号从0到N-1.然后N行紧随其后,每行对应一个节点,并给出节点的左右子节点......
  • Potplayer+Alist+网盘,实现网盘视频免费在线看4K杜比HDR
    Potplayer+Alist+网盘,实现网盘视频免费在线看4K杜比HDR引言最近刷视频看到了一个方法可以通过alist挂载网盘,配合potplayer可实现超高画质免费在线观看视频,这里发一下配置的过程。一、Potplayer下载中文官网:PotPlayer中文网-万能格式影音视频播放器PotPlayer播放器PotPlay......
  • java 时间段划分 1.把一个时间段划分为 整天 和非整天的时间段 2. 把List<Loca
     时间段划分  1.把一个时间段划分为整天和非整天的时间段  例如: "2024-07-1108:30:00" ~   "2024-07-2308:30:00";例如 完整的日期:2024-07-122024-07-132024-07-142024-07-152024-07-162024-07-172024-07-182024-07-192024-07-202024-07-21202......
  • 【数据结构】LinkedList与链表
    目录链表1、链表的概念及结构 2、LinkedList的使用2、1什么是LinkedList2、2LinkedList的使用3、LinkedList的遍历4、LinkedList的模拟实现 5、ArrayList和LinkedList的区别上篇已经熟悉了ArrayList的使用,ArrayList底层使用数组来存储元素。由于其底层是一段连续......