Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题

本文主要是介绍Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 前言
  • 一、需要实现的效果如下
  • 二、flutter实现代码如下:
  • 总结


前言

最近写flutter项目,遇到NestedScrollView与TabBar双列表滚动位置同步问题,下面是解决方案,希望帮助到大家。


一、需要实现的效果如下

1、UI图:
请添加图片描述
需要实现的效果是,左边滑动的时候,右边的列表不要随左边滑动。右边滑动的时候,左边也不要滑动。

二、flutter实现代码如下:

1、用flutter原生的NestedScrollView是有问题的
2、使用第三方库解决这个问题extended_nested_scroll_view: ^6.2.1
3、完整的代码如下:

import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/material.dart';void main() {runApp(const MyBitApp());
}class MyBitApp extends StatelessWidget {const MyBitApp({super.key});// This widget is the root of your application.Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),useMaterial3: true,),home: MyApp(),);}
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'NestedScrollView Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(),);}
}class MyHomePage extends StatefulWidget {_MyHomePageState createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {late TabController _tabController;late List<ScrollController> _scrollControllers;late ScrollController nestedScrollController;void initState() {super.initState();_tabController = TabController(length: 2, vsync: this);_scrollControllers = [ScrollController(),ScrollController(),];nestedScrollController = ScrollController();}void dispose() {_tabController.dispose();for (var controller in _scrollControllers) {controller.dispose();}super.dispose();}Widget build(BuildContext context) {// var tabBarHeight = primaryTabBar.preferredSize.height;double statusBarHeight = MediaQuery.of(context).padding.top;var pinnedHeaderHeight = statusBarHeight + kToolbarHeight;return Scaffold(body: DefaultTabController(length: 2,child: ExtendedNestedScrollView(onlyOneScrollInBody: true,pinnedHeaderSliverHeightBuilder: () => pinnedHeaderHeight,headerSliverBuilder: (context, innerBoxIsScrolled) {return [SliverAppBar(title: Text('NestedScrollView Demo'),pinned: true,floating: true,expandedHeight: 200,stretch: true,elevation: 0,stretchTriggerOffset: 100,bottom: TabBar(controller: _tabController,tabs: [Tab(text: 'Tab 1'),Tab(text: 'Tab 2'),],),),];},body: TabBarView(controller: _tabController,children: [KeepAliveWrapper(child: MediaQuery.removePadding(removeTop: true,context: context,child: ListView.builder(itemCount: 1000,itemBuilder: (context, index) {return ListTile(title: Text('Tab 1 Item $index'),);},),),),KeepAliveWrapper(child: MediaQuery.removePadding(removeTop: true,context: context,child: ListView.builder(itemCount: 1000,itemBuilder: (context, index) {return ListTile(title: Text('Tab 2 Item $index'),);},),),),],),),),);}
}class KeepAliveWrapper extends StatefulWidget {final Widget child;const KeepAliveWrapper({Key? key, required this.child}) : super(key: key);_KeepAliveWrapperState createState() => _KeepAliveWrapperState();
}class _KeepAliveWrapperState extends State<KeepAliveWrapper> with AutomaticKeepAliveClientMixin {Widget build(BuildContext context) {super.build(context);return widget.child;}bool get wantKeepAlive => true;
}

总结

这就是Flutter解决NestedScrollView与TabBar双列表滚动位置同步问题相关代码,希望能帮助到你!

这篇关于Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja