当前位置: 首页 > news >正文

Flutter中的 extended_nested_scroll_view 库:介绍与使用指南

在开发Flutter应用时,处理复杂的滚动效果是一项常见的任务。Flutter提供了NestedScrollView来实现可折叠的应用栏与滚动列表的结合,但在某些情况下,NestedScrollView可能不够强大。为了解决这些问题,我们可以使用extended_nested_scroll_view库,该库对NestedScrollView进行了扩展,提供了更多的功能和更灵活的滚动控制。

为什么选择extended_nested_scroll_view

extended_nested_scroll_view库主要解决了Flutter原生NestedScrollView在某些场景下的不足之处,以下是它的几个优点:

  • 支持TabBarView的同步滚动:在多个Tab页面之间切换时,能够保持滑动位置的一致性。
  • 提供更灵活的滚动控制:更好地处理复杂的嵌套滚动场景,如在列表头部添加自定义布局。
  • 解决内外滚动冲突:更好地处理内外滚动视图之间的滑动事件冲突。

如何使用extended_nested_scroll_view

1. 添加依赖

pubspec.yaml文件中添加extended_nested_scroll_view库的依赖:

dependencies:flutter:sdk: flutterextended_nested_scroll_view: ^最新版本号

然后运行命令安装依赖:

flutter pub get

2. 基本使用示例

下面是一个基本的extended_nested_scroll_view使用示例,它展示了如何创建一个具有可折叠AppBar和多个Tab页面的界面。

 import 'package:flutter/material.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'as extended;void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'Extended Nested ScrollView Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: HomeScreen(),);}
}class HomeScreen extends StatelessWidget {Widget build(BuildContext context) {return DefaultTabController(length: 3,child: Scaffold(body: extended.ExtendedNestedScrollView(headerSliverBuilder: (context, innerBoxIsScrolled) {return [SliverAppBar(title: const Text('Extended Nested ScrollView'),pinned: true,expandedHeight: 200.0,flexibleSpace: FlexibleSpaceBar(background: Image.network('https://example.com/image.jpg',fit: BoxFit.cover,),),bottom: const TabBar(tabs: [Tab(icon: Icon(Icons.directions_car), text: 'Car'),Tab(icon: Icon(Icons.directions_transit), text: 'Transit'),Tab(icon: Icon(Icons.directions_bike), text: 'Bike'),],),),];},body: TabBarView(children: [_buildTabContent('Car Page'),_buildTabContent('Transit Page'),_buildTabContent('Bike Page'),],),),),);}Widget _buildTabContent(String title) {return extended.ExtendedVisibilityDetector(uniqueKey: Key(title),child: ListView.builder(key: PageStorageKey<String>(title),itemCount: 30,itemBuilder: (context, index) {return ListTile(title: Text('$title Item $index'),);},),);}
}

3. 解释示例

在上面的示例中,我们使用了extended.ExtendedNestedScrollView代替Flutter自带的NestedScrollView。关键代码如下:

  • headerSliverBuilder:用于构建头部可滚动部分,包括SliverAppBar
  • TabBarView:配合TabBar实现多个选项卡视图。
  • NestedScrollViewInnerScrollPositionKeyWidget:用于确保每个Tab页面的ListView具有唯一的滚动位置,这样可以在Tab切换时保持滚动状态。

4. 进阶使用:同步Tab页面的滚动位置

extended_nested_scroll_view提供了更为高级的功能,例如在不同Tab页面之间同步滚动位置。我们可以使用TabBarViewcontroller属性结合extended.ExtendedNestedScrollViewcontroller来实现这一点。

import 'package:flutter/material.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'as extended;void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'Extended Nested ScrollView Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: HomeScreen(),);}
}class HomeScreen extends StatefulWidget {_HomeScreenState createState() => _HomeScreenState();
}class _HomeScreenState extends State<HomeScreen> with TickerProviderStateMixin {late TabController _tabController;void initState() {super.initState();_tabController = TabController(length: 3, vsync: this);}Widget build(BuildContext context) {return Scaffold(body: extended.ExtendedNestedScrollView(headerSliverBuilder: (context, innerBoxIsScrolled) {return [SliverAppBar(title: const Text('Extended Nested ScrollView'),pinned: true,expandedHeight: 200.0,flexibleSpace: FlexibleSpaceBar(background: Image.network('https://example.com/image.jpg',fit: BoxFit.cover,),),bottom: TabBar(controller: _tabController,tabs: const [Tab(icon: Icon(Icons.directions_car), text: 'Car'),Tab(icon: Icon(Icons.directions_transit), text: 'Transit'),Tab(icon: Icon(Icons.directions_bike), text: 'Bike'),],),),];},body: TabBarView(controller: _tabController,children: [_buildTabContent('Car Page'),_buildTabContent('Transit Page'),_buildTabContent('Bike Page'),],),),);}Widget _buildTabContent(String title) {return extended.ExtendedVisibilityDetector(uniqueKey: Key(title),child: ListView.builder(key: PageStorageKey<String>(title),itemCount: 30,itemBuilder: (context, index) {return ListTile(title: Text('$title Item $index'),);},),);}
}

常见问题和解决方案

1. 滚动位置同步问题

在使用extended_nested_scroll_view时,确保每个子列表视图使用ExtendedVisibilityDetector包裹,并且使用唯一的Key以防止滚动位置错误。

2. Tab切换时滚动状态恢复

extended_nested_scroll_view可以很好地管理Tab页面之间的滚动状态切换,如果遇到问题,可以检查PageStorageKey的使用是否正确。

结论

extended_nested_scroll_view库提供了更强大和灵活的滚动布局解决方案,使得在Flutter中实现复杂的UI设计更加容易。如果你的应用需要处理复杂的滚动场景,或者需要在多个Tab页面之间保持一致的滚动体验,那么extended_nested_scroll_view是一个非常不错的选择。

相关文章:

Flutter中的 extended_nested_scroll_view 库:介绍与使用指南

在开发Flutter应用时&#xff0c;处理复杂的滚动效果是一项常见的任务。Flutter提供了NestedScrollView来实现可折叠的应用栏与滚动列表的结合&#xff0c;但在某些情况下&#xff0c;NestedScrollView可能不够强大。为了解决这些问题&#xff0c;我们可以使用extended_nested_…...

Elasticsearch 综合搜索案例解析

Elasticsearch 是一个功能强大的搜索引擎&#xff0c;它不仅支持全文搜索&#xff0c;还提供了排序、分页、高亮显示等多种搜索结果处理功能。通过综合使用这些功能&#xff0c;我们可以构建出丰富而高效的搜索应用。本文将通过一个具体的案例&#xff0c;介绍如何在 Elasticse…...

Web存储革命:揭秘JavaScript的会话存储(sessionStorage)

标题&#xff1a;Web存储革命&#xff1a;揭秘JavaScript的会话存储&#xff08;sessionStorage&#xff09; 在当今的Web开发中&#xff0c;状态管理和数据持久化是构建交互式应用的关键。JavaScript提供了多种客户端存储解决方案&#xff0c;其中会话存储&#xff08;sessio…...

基于python的百度迁徙迁入、迁出数据分析(九)

副标题&#xff1a;从百度迁徙数据看——人口虹吸效应 人口虹吸效应&#xff1a;人口虹吸效应是指大城市或中心城市因其经济、文化、教育、医疗等资源的优势&#xff0c;吸引周边地区的人口、资本和其他资源向其集中的一种现象。这种效应在城市化进程中尤其明显&#xff0c;通…...

2025上海礼品展 华东礼品工艺品展览会

2025第25届上海国际礼品及家居用品展 在璀璨繁华的上海&#xff0c;一场盛大的礼品盛宴即将拉开帷幕。2025年上海国际礼品及 家居用品展览会(简称“华礼展”)&#xff0c;作为华东地区乃至全国范围内备受瞩目的礼 品行业盛会&#xff0c;将于2025年6月29日至7月1日在上海新国…...

Flink开发(一):概述与基础

目录 1. Flink概述 1.1 什么是Flink&#xff1f; 1.2 Flink的主要特点 2. Flink的核心组件 2.1 Flink架构 2.2 数据流模型 3. Flink的基础应用 3.1 开发环境配置 3.3 数据源和数据接收器 4. Flink的高级功能 4.1 状态管理与容错 4.2 窗口操作 5. Flink的应用场景 …...

GD32E503实现串口中断收发功能

如有技术问题及技术需求请加作者微信! 源码下载链接:代码下载 亲测可用实现GD32E503库函数串口数据收发功能: #include "gd32e50x.h" #include "gd32e503v_eval.h" #include "systick.h" #include <stdio.h> #include "user_uart…...

照片怎么提取文字?分享5种简单好用的提取方法

在我们日常的学习或者是办公中&#xff0c;往往会使用到大量的图片文件&#xff0c;而在这些图片中往往蕴含着丰富的文字信息&#xff0c;但手动输入不仅费时费力&#xff0c;还容易出错。如果能够一键提取出图片中的文字就会大大提高工作效率&#xff0c;下面给大家分享5种提取…...

最佳云服务器推荐:三丰云免费虚拟主机和云服务器

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始将业务迁移到云端。在这个过程中&#xff0c;选择一款稳定、高效、性价比高的云服务器至关重要。今天&#xff0c;我就为大家推荐一家备受好评的云服务器提供商——三丰云&#xff08;https://www.sanfengyun.com…...

IPKISS Tutorial 目录(目前 45 篇 持续更新中,部分教程尚未制作成目录)

IPKISS Tutorial 目录 芯片版图绘制教程IPKISS Tutorial&#xff08;5&#xff09;Basis直接创建结构&#xff08;1&#xff09;PCell&#xff08;3&#xff09;Layer and Template(Trace Template)&#xff08;2&#xff09;参数查询&#xff08;2&#xff09;Lumerical API&a…...

加强混合工作时代的组织网络安全态势

随着组织转向采用和实施混合和远程工作模式&#xff0c;网络安全的重要性从未如此重要。虽然工作场所的这种演变提供了灵活性并有望提高生产力&#xff0c;但它也带来了组织无法忽视的无数网络安全挑战。多样化工作环境的整合需要强大的安全措施、创新的保护策略和警惕的文化&a…...

vivado报错:file ended before end of clause

最近在学习Xilinx FPGA时&#xff0c;遇到 Vivado 报错如下图所示&#xff1a; 刚开始&#xff0c;看到错误是在第1行代码中出现的&#xff0c;我的第一反应是该行代码写错了&#xff0c;然后搜了搜语法&#xff0c;发现没错。 分析报错信息发现&#xff0c;该错误应该是和文件…...

基于asp.net的webform框架的校园点餐系统源码

今天给大家分享一套基于asp.net的webform框架的网页点餐系统&#xff0c;适合课程设计参考及其自己学习&#xff0c;需要的小伙伴自己参考下&#xff0c;下载链接我放在后面了 主要功功能 系统的主要功能包含&#xff1a;前端点餐页面、加入购物车、商品食物浏览、我的购 物车…...

俞敏洪,真窝囊?

文&#xff5c;琥珀食酒社 作者 | 璇子 大家都被俞敏洪骗了 当年《中国合伙人》一播出 俞敏洪竟抱怨黄晓明说&#xff1a; “你把我演得太窝囊&#xff01;” 那俞敏洪真的不窝囊吗&#xff1f; 他培养出董宇辉 让他赚了近6亿 结果人没留住、公司也送了人 还要被丈母娘…...

速盾:高防ip和cdn哪个好?

高防IP和CDN是两种常见的网站安全解决方案&#xff0c;它们在提供网站安全保护方面有着不同的优势和特点。下面&#xff0c;我们将从技术原理、性能优势和适用场景等方面进行比较&#xff0c;帮助您选择适合自己网站的解决方案。 首先&#xff0c;我们来看看高防IP的特点。高防…...

论文分享|MLLMs中多种模态(图像/视频/音频/语音)的tokenizer梳理

本文旨在对任意模态输入-任意模态输出 (X2X) 的LLM的编解码方式进行简单梳理&#xff0c;同时总结一些代表性工作。 注&#xff1a;图像代表Image&#xff0c;视频代表Video&#xff08;不含声音&#xff09;&#xff0c;音频代表 Audio/Music&#xff0c;语音代表Speech 各种…...

如何使用 Puppeteer 和 Node.JS 进行 Web 抓取?

什么是 Headlesschrome&#xff1f; Headless&#xff1f;是的&#xff0c;这意味着这个浏览器没有图形用户界面 (GUI)。不用鼠标或触摸设备与视觉元素交互&#xff0c;你需要使用命令行界面 (CLI) 来执行自动化操作。 Headlesschrome 和 Puppeteer 很多网页抓取工具都可适用…...

JDK 8 有哪些新特性?

JDK 8 引入了一系列新特性&#xff0c;主要包括&#xff1a; 1. 元空间替代了永久代 解决了永久代的内存管理、性能问题。提高了类加载器的隔离性。增强了可扩展性和跨平台性。提升了与垃圾收集器的兼容性。 因为 JDK8 要把 JRockit 虚拟机和 Hotspot 虚拟机融合&#xff0c…...

C++ Win32API 贪吃蛇游戏

程序代码&#xff1a; #include <windows.h> #include <list> #include <ctime>// 定义游戏区域大小 const int width 20; const int height 20;// 定义贪吃蛇的方向 enum Direction { UP, DOWN, LEFT, RIGHT };// 定义贪吃蛇的节点 struct SnakeNode {in…...

【Python实现代码视频/视频转字符画/代码风格视频】

该程序改良自GitHub开源项目VideoCharDraw 在源程序CharDraw_thread.py 带压缩和多线程版本字符画的基础上使用Tkinter库添加了图形化的操作&#xff0c;使用户操作体验更方便。 什么是视频字符画&#xff1f; 视频转字符画是一种将视频中的每一帧图像转换为由字符组成的图…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...