Flutter-插件 scroll-to-index 实现 listView 滚动到指定索引位置

请添加图片描述
scroll-to-index

简介

scroll_to_index 是一个 Flutter 插件,用于通过索引滚动到 ListView 中的某个特定项。这个库对复杂滚动需求(如动态高度的列表项)非常实用,因为它会自动计算需要滚动的目标位置。

使用

  1. 安装插件
flutter pub add scroll_to_index
  1. 导入包
import 'package:scroll_to_index/scroll_to_index.dart';
  1. 初始化控制器
    使用 AutoScrollController 来控制滚动。AutoScrollController 是插件提供的增强版本,它支持滚动到指定索引的功能。

  2. 为列表项添加标识
    通过 AutoScrollTag 为每个列表项添加滚动标签。

  3. 调用滚动方法
    使用 controller.scrollToIndex 方法滚动到指定的索引。

示例代码

import 'package:flutter/material.dart';
import 'package:scroll_to_index/scroll_to_index.dart';class ScrollToIndexExample extends StatefulWidget {@override_ScrollToIndexExampleState createState() => _ScrollToIndexExampleState();
}class _ScrollToIndexExampleState extends State<ScrollToIndexExample> {late AutoScrollController controller;final randomHeights = List<double>.generate(20, (index) => 50.0 + (index % 5) * 30.0);@overridevoid initState() {super.initState();controller = AutoScrollController(); // 初始化 AutoScrollController}@overridevoid dispose() {controller.dispose();super.dispose();}Future<void> scrollToIndex(int index) async {await controller.scrollToIndex(index,preferPosition: AutoScrollPosition.begin, // 滚动目标位置(begin, middle, end));controller.highlight(index); // 高亮滚动到的项(可选)}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Scroll To Index Example'),),body: Column(children: [ElevatedButton(onPressed: () => scrollToIndex(10), // 滚动到第10项child: Text('滚动到第10项'),),Expanded(child: ListView.builder(controller: controller, // 使用 AutoScrollControlleritemCount: randomHeights.length,itemBuilder: (context, index) {return AutoScrollTag(key: ValueKey(index), // 为每个项设置唯一的 Keycontroller: controller,index: index,child: Container(margin: const EdgeInsets.symmetric(vertical: 5.0),height: randomHeights[index],color: Colors.blue[(index % 9 + 1) * 100],alignment: Alignment.center,child: Text('Item $index', style: TextStyle(color: Colors.white, fontSize: 18)),),highlightColor: Colors.yellow.withOpacity(0.5), // 滚动时的高亮颜色);},),),],),);}
}

实现原理

1. 索引与视图的绑定
• AutoScrollTag 负责注册每个列表项的索引及其对应的 State。
• AutoScrollController 持有一个 tagMap,这是一个 Map<int,AutoScrollTagState>,记录每个索引和对应的渲染状态。

2. 滚动到指定索引
核心方法是 scrollToIndex:

Future scrollToIndex(int index,{Duration duration: scrollAnimationDuration,AutoScrollPosition? preferPosition});

滚动方法的源码:

  RevealedOffset? _offsetToRevealInViewport(int index, double alignment) {final ctx = tagMap[index]?.context;if (ctx == null) return null;final renderBox = ctx.findRenderObject()!;assert(Scrollable.of(ctx) != null);final RenderAbstractViewport viewport =RenderAbstractViewport.of(renderBox)!;final revealedOffset = viewport.getOffsetToReveal(renderBox, alignment);return revealedOffset;}

关键实现详解
2.1 获取目标项的 context

final ctx = tagMap[index]?.context;
if (ctx == null) return null;
•	tagMap:存储索引和其对应的 AutoScrollTagState。
•	context:通过目标项的 State 获取其 BuildContext,用于访问渲染对象。

2.2 获取渲染对象

final renderBox = ctx.findRenderObject()!;

• findRenderObject:从 context 获取目标项的 RenderObject。
• RenderBox:表示目标项的渲染边界,用于计算其在视图中的位置。

2.3 获取视图范围

final RenderAbstractViewport viewport = RenderAbstractViewport.of(renderBox)!;

RenderAbstractViewport.of(renderBox):
• 获取目标项所属的 Viewport(视图),如 ListView 的可滚动区域。
• RenderAbstractViewport 是 Flutter 渲染层的抽象类,用于处理滚动和可见区域计算。

2.4 计算偏移量

final revealedOffset = viewport.getOffsetToReveal(renderBox, alignment);

viewport.getOffsetToReveal:
• 计算目标项(renderBox)相对于视图的滚动偏移量。
• 偏移量根据 alignment 决定,确保目标项按照指定对齐方式显示。

3. 视图边界处理
AutoScrollController 提供了视图边界计算功能,确保滚动时能够正确定位组件的可见区域。
相关属性:

ViewportBoundaryGetter viewportBoundaryGetter;
AxisValueGetter beginGetter;
AxisValueGetter endGetter;

viewportBoundaryGetter:
用于获取视图的边界范围,支持处理额外的遮挡组件(如固定头部或底部)。

beginGetter 和 endGetter:
根据滚动方向(水平或垂直),分别获取组件的起始和结束位置。

原理总结

  1. 绑定关系:
    • 通过 tagMap 确定目标索引和对应的渲染对象。
  2. 偏移计算:
    • 借助 RenderAbstractViewport.getOffsetToReveal,计算目标项相对于视图的偏移量。
  3. 滚动控制:
    • 调用 ScrollController.animateTo 方法将视图滚动到计算的偏移量位置,实现精准对齐。

感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501463.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我用AI学Android Jetpack Compose之开篇

最近突发奇想&#xff0c;想学一下Jetpack Compose&#xff0c;打算用Ai学&#xff0c;学最新的技术应该要到官网学&#xff0c;不过Compose已经出来一段时间了&#xff0c;Ai肯定学过了&#xff0c;用Ai来学&#xff0c;应该问题不大&#xff0c;学习过程记录下来&#xff0c;…

PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)

文章目录 发送消息原理说明发送功能实现html部分javascript代码PHP代码 发送消息原理说明 接下来我们发送聊天的文本信息。点击发送按钮的时候&#xff0c;会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器&#xff0c;服务器再转发给对方。文本框的id为msgcont…

网络安全 | 信息安全管理体系(ISMS)认证与实施

网络安全 | 信息安全管理体系&#xff08;ISMS&#xff09;认证与实施 一、前言二、信息安全管理体系&#xff08;ISMS&#xff09;概述2.1 ISMS 的定义与内涵2.2 ISMS 的核心标准 ——ISO/IEC 27001 三、信息安全管理体系&#xff08;ISMS&#xff09;认证3.1 认证的意义与价值…

服务器数据恢复—服务器硬盘亮黄灯的数据恢复案例

服务器硬盘指示灯闪烁黄灯是一种警示&#xff0c;意味着服务器硬盘出现故障即将下线。发现这种情况建议及时更换硬盘。 一旦服务器上有大量数据频繁读写&#xff0c;硬盘指示灯会快速闪烁。服务器上某个硬盘的指示灯只有黄灯亮着&#xff0c;而其他颜色的灯没有亮的话&#xff…

AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙

AfuseKt是一款功能强大的安卓端在线视频播放器&#xff0c;广泛兼容多种平台如阿里云盘、Alist、WebDAV、Emby、Jellyfin等&#xff0c;同时也支持本地存储视频文件的播放。其特色功能包括自动抓取影片信息生成海报墙展示&#xff0c;充分利用设备硬件进行高清视频流畅播放&…

数字孪生:物联+数据打造洞察世界新视角

引言&#xff1a;数字孪生是物理系统向信息空间映射的关键技术&#xff0c;通过传感器、数据分析、物联网&#xff0c;实现实时模拟和控制。新一代信息技术支撑数字孪生的广泛应用&#xff0c;使其在工业、城市、交通、医疗、水利等多领域实现虚拟与现实融合&#xff0c;促进经…

“AI智慧教学系统:开启个性化教育新时代

大家好&#xff0c;我是老王&#xff0c;一个在产品圈摸爬滚打多年的资深产品经理。今天&#xff0c;我想和大家聊聊一个最近特别火的概念——AI智慧教学系统。这东西听起来好像很高大上&#xff0c;但其实和我们每个人都息息相关&#xff0c;因为它关系到我们下一代的教育。 一…

【开源项目】数字孪生立交~东湖高新区互通式立交数字孪生可视化项目——开源工程及源码

飞渡科技数字孪生立交管理平台&#xff0c;依托国产自研数字孪生引擎&#xff0c;融合地理空间数据、倾斜摄影、人工智能及物联网IOT等多种技术&#xff0c;实现对立交的安全监测以及养护管理。 基于GIS技术&#xff0c;呈现立交的空间区位分布。 将交通流量数据以云图形式呈现…

树莓派 Pico RP2040 教程点灯 双核编程案例

双核点亮不同的 LED 示例&#xff0c;引脚分别是GP0跟GP1。 #include "pico/stdlib.h" #include "pico/multicore.h"#define LED1 0 // 核心 0 控制的 LED 引脚 #define LED2 1 // 核心 1 控制的 LED 引脚// the setup function runs once when you press …

ASA第六天笔记

Botnet Traffic Filter简介 1.僵死网络流量过滤特性是一个基于名誉的机制&#xff0c;用于阻止流量源自于或者去往已知的感染主机。 2.僵死网络流量过滤比较每一个连接中的源和目的IP地址。 动态SensorBase数据库&#xff0c;被Cisco动态更新。静态数据库&#xff0c;需要手动…

网关的主要作用

在网络安全领域&#xff0c;网关扮演着举足轻重的角色&#xff0c;它不仅是网络间的桥梁&#xff0c;更是安全防线的守护者。以下是网关在网络安全中的几个关键作用&#xff1a; 1. 防火墙功能&#xff1a;网关常常集成了防火墙技术&#xff0c;能够对进出网络的数据包进行严格…

【模型】Qwen2-VL 服务端UI

1. 前言 最近在测试VLM模型&#xff0c;发现官方的网页demo&#xff0c;代码中视频与图片分辨率可能由于高并发设置的很小&#xff0c;导致达不到预期效果&#xff0c;于是自己研究了一下&#xff0c;搞了一个简单的前端部署&#xff0c;自己在服务器部署了下UI界面&#xff0…

leetcode题目(3)

目录 1.加一 2.二进制求和 3.x的平方根 4.爬楼梯 5.颜色分类 6.二叉树的中序遍历 1.加一 https://leetcode.cn/problems/plus-one/ class Solution { public:vector<int> plusOne(vector<int>& digits) {int n digits.size();for(int i n -1;i>0;-…

数据库知识汇总2

一. 范式 定义&#xff1a;范式是符合某一种级别的关系模式的集合。 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式&#xff1b; 一个低一级范式的关系模式&#xff0c;通过模式分解&#xff08;schema decomposition&#xff09;可以转换为若干个高一…

Eplan 布局图中的宏/设备/安装板比例缩放

在Eplan的布局图&#xff0c;有时要放大或缩小宏或设备&#xff0c;有两种办法 1.选中宏/设备/安装板等&#xff0c;在 编辑--图形中选择比例缩放即可&#xff0c;但这种方式会造成尺寸标注与实际长度不符&#xff0c;需要手动修改尺寸标注值。 2.修改页面的比例&#xff0c;在…

zookeeper+kafka

一、zookeeper 1.概述 zoo: 开源的分布式框架协调服务 zookeeper的工作机制&#xff1a;基于观察者模式设计的分布式结构&#xff0c;负责存储和管理架构当中的元信息&#xff0c;架构当中的应用接受观察者的监控&#xff0c;一旦数据有变化&#xff0c;通知对应的zookeeper&a…

Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在快节奏的生活中&#xff0c;家庭聚餐成为了连接亲情…

Ungoogled Chromium127 编译指南 MacOS 篇(一)- 项目介绍

1. 引言 在当今互联网时代&#xff0c;浏览器不仅是我们访问网络的窗口&#xff0c;更是保护个人隐私的重要工具。然而&#xff0c;主流浏览器普遍存在数据收集和隐私问题。大多数用户可能并不知道&#xff0c;当我们使用 Chrome 浏览器时&#xff0c;会有大量的个人数据被收集…

Alist-Sync-Web 网盘自动同步,网盘备份相互备份

Alist-Sync-Web 一个基于 Web 界面的 Alist 存储同步工具&#xff0c;支持多任务管理、定时同步、差异处理等功能。 功能特点 &#x1f4f1; 美观的 Web 管理界面&#x1f504; 支持多任务管理⏰ 支持 Cron 定时任务&#x1f4c2; 支持数据同步和文件同步两种模式&#x1f5…

前后端分离项目部署到云服务器、宝塔(前端vue、后端springboot)详细教程

一、部署介绍 部署的环境是宝塔&#xff08;宝塔9.0.0&#xff09;、阿里云服务器&#xff08;centos 7.6&#xff09;&#xff1b;前端是Vue3项目、后端是springboot3x、jdk11、数据库有redis、mysql&#xff1b;搜索采用的是es。 由于宝塔面板中可以快速进行环境的配置&…