Flutter-无限循环滚动标签

2024-06-20 08:44

本文主要是介绍Flutter-无限循环滚动标签,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 序章

在现代移动应用开发中,滑动视图是常见的交互模式之一。特别是当你需要展示大量内容时,使用自动滚动的滑动视图可以显著提升用户体验。在这篇文章中,我们将讨论如何使用 Flutter 实现一个自动滚动的列表视图。

2. 效果

3. 实现思路

为了实现一个自动滚动的列表视图,我们需要考虑以下几点:

  1. ScrollController 管理:每个横向列表需要一个 ScrollController 来管理其滚动状态。
  2. 自动滚动机制:使用 Timer 定时器定期触发滚动事件。
  3. 用户交互管理:通过手势检测来判断用户何时开始或结束手动滚动,并暂停或恢复自动滚动。

4. 实现代码

以下是实现这个功能的完整代码:

import 'dart:async';
import 'package:flutter/material.dart';//https://github.com/yixiaolunhui/flutter_xy
class LoopScrollWidget extends StatefulWidget {final List<List<dynamic>> items;final double? rowHeight;final Widget Function(BuildContext context, int rowIndex, int index) itemBuilder;const LoopScrollWidget({Key? key,this.rowHeight = 50,required this.items,required this.itemBuilder,}) : super(key: key);LoopScrollWidgetState createState() => LoopScrollWidgetState();
}class LoopScrollWidgetState extends State<LoopScrollWidget> {late final List<ScrollController> _scrollControllers;late final List<bool> _isScrollingList;final double _scrollIncrement = 4.0;final Duration _scrollDuration = const Duration(milliseconds: 50);Timer? _scrollTimer;void initState() {super.initState();_scrollControllers = List.generate(widget.items.length, (index) => ScrollController());_isScrollingList = List.generate(widget.items.length, (index) => false);WidgetsBinding.instance.addPostFrameCallback((_) {_startAutoScroll();});}void dispose() {_scrollTimer?.cancel();for (var controller in _scrollControllers) {controller.dispose();}super.dispose();}Widget build(BuildContext context) {return Column(children: List.generate(widget.items.length, (rowIndex) {return GestureDetector(onPanDown: (_) => _isScrollingList[rowIndex] = true,onPanEnd: (_) => _isScrollingList[rowIndex] = false,onTapUp: (_) => _isScrollingList[rowIndex] = false,child: NotificationListener<ScrollNotification>(onNotification: (notification) {if (notification is ScrollEndNotification) {_isScrollingList[rowIndex] = false;}return false;},child: SizedBox(height: widget.rowHeight,child: ListView.builder(controller: _scrollControllers[rowIndex],physics: const BouncingScrollPhysics(),scrollDirection: Axis.horizontal,itemBuilder: (context, index) {final position = index % widget.items[rowIndex].length;return Row(children: [widget.itemBuilder(context, rowIndex, position)],);},),),),);}),);}void _startAutoScroll() {_scrollTimer?.cancel();_scrollTimer = Timer.periodic(_scrollDuration, (timer) {for (var i = 0; i < _scrollControllers.length; i++) {if (!_isScrollingList[i] && _scrollControllers[i].hasClients) {_scrollControllers[i].animateTo(_scrollControllers[i].offset + _scrollIncrement,duration: _scrollDuration,curve: Curves.linear,);}}});}
}

详细解释

  1. Stateful WidgetLoopScrollWidget 继承自 StatefulWidget,其状态管理由 LoopScrollWidgetState 类负责。
  2. 初始化:在 initState 方法中,我们初始化了每个行的 ScrollController 和一个布尔列表 _isScrollingList 来跟踪哪些行正在被手动滚动。
  3. 自动滚动:使用 Timer.periodic 来定时滚动每一行,除非该行当前正在被手动滚动。
  4. 手势检测:使用 GestureDetector 来检测用户何时开始或结束手动滚动,并通过 NotificationListener 来监听滚动结束通知。

详情:github.com/yixiaolunhui/flutter_xy

这篇关于Flutter-无限循环滚动标签的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077648

相关文章

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

C语言 while循环1

在C语言里有3种循环:while循环    do  while 循环    for循环 while语句 //while语法结构while(表达式)循环语句; 比如在屏幕上打印1-10 在while循环中 break用于永久的终止循环 在while循环中,continue的作用是跳过本次循环 continue后边的代码,直接去判断部分,看是否进行下一次循环 //getcha

Linux网络编程之循环服务器

1.介绍 Linux网络循环服务器是指逐个处理客户端的连接,处理完一个连接后再处理下一个连接,是一个串行处理的方式,比较适合时间服务器,DHCP服务器.对于TCP服务器来说,主要阻塞在accept函数,等待客户端的连接。而对于UDP服务器来说,主要阻塞在recv函数. 2.循环服务器模型 TCP循环服务器: 算法如下:          socket(...);

Flutter ListView详解

文章示例代码 ListView常用构造 ListView 我们可以直接使用ListView 它的实现也是直接返回最简单的列表结构,粗糙没有修饰。 ListView 默认构建 效果 ///默认构建 Widget listViewDefault(List list) { List _list = new List(); for (int i = 0; i < list.length;

Flutter原理—深入Widget原理

事实上在 Flutter 中渲染是经历了从 Widget 到 Element 再到 RenderObject 的过程。 Widget 只是 Element 的一个配置描述 ,告诉 Element 这个实例如何去渲染。 Widget 和 Element 之间是一对多的关系 。实际上渲染树是由 Element 实例的节点构成的树,而作为配置文件的 Widget 可能被复用到树的多个部分,对应产

nlp基础-文本预处理及循环神经网络

1 认识文本预处理 1 文本预处理及其作用 定义:文本送给模型之前,提前要做的工作 作用:指导模型超参数的选择 、提升模型的评估指标 举个例子: 思路常识,打造成 X Y关于Y:10分类标签是否均衡关于X:数据有没有脏数据 数据长度(512)样本不够! 文本预处理 工作 结束 的标志:准备出来X和Y 能送给模型 2 文本预处理的主要环节 1 文本处理的基本方法 分词:按照一定规

html标签转换成img图片

app 里的元素需要转换成图片 <script src="../assets/js/html2canvas.min.js"></script>$(function () {html2canvas(document.querySelector("#app"), {useCORS: true}).then(canvas => {layer.close(vm.layerIndex)var img =

2021-02-16物料档案条码添加和蓝牙条码标签打印,金蝶安卓盘点机PDA,金蝶仓库条码管理WMS系统

物料档案条码添加和蓝牙条码标签打印,金蝶安卓盘点机PDA https://member.bilibili.com/platform/upload-manager/article 本期视频我们来讲解一下汉点机PDA条码添加和条码标签蓝牙便携打印: 在实际使用中,我们商品有两种情况: 一种是商品本身就有条码, 比如:超市卖的可口可乐,牛奶等商品,商品本身就有69开头的国标码,那么我们就可以使用盘点

abbr 标签的使用

更多内容: http://blog.yuhai.win 作用:标签指示简称或者缩写 用法: The <abbr title="People's Republic of China">PRC</abbr> was founded in 1949.