listview刷新_Flutter NestedScrollView 滑动折叠头部下拉刷新效果

题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精。


Flutter是谷歌推出的最新的移动开发框架。

本实例运行效果如下 :

9db1fe1b4f5a7b7c70e2374625923d05.gif

//启动函数void main() {  runApp(RootApp());}//根目录class RootApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    return MaterialApp(      theme: ThemeData(primaryColor: Colors.grey[200]),      //默认启动的页面      home: HomePage(),    );  }}

初始化创建一个 TabController 用来控制 TabBar 与 TabBarView的联动效果:

class HomePage extends StatefulWidget {  @override  StatecreateState() {    return _ScrollHomePageState();  }}class _ScrollHomePageState extends State with SingleTickerProviderStateMixin {  //在这里标签页面使用的是TabView所以需要创建一个控制器  TabController tabController;  //页面初始化方法  @override  void initState() {    super.initState();    //初始化    tabController = new TabController(length: 3, vsync: this);  }  //页面销毁回调生命周期  @override  void dispose() {    tabController.dispose();  }  ...}

对于页面的主体 使用了 Scaffold :

@overrideWidget build(BuildContext context) {  //构建页面的主体  return Scaffold(    //下拉刷新    body: RefreshIndicator(      //可滚动组件在滚动时会发送ScrollNotification类型的通知      notificationPredicate: (ScrollNotification notifation) {        //该属性包含当前ViewPort及滚动位置等信息        ScrollMetrics scrollMetrics = notifation.metrics;        if (scrollMetrics.minScrollExtent == 0) {          return true;        } else {          return false;        }      },      //下拉刷新回调方法      onRefresh: () async {        //模拟网络刷新 等待2秒        await Future.delayed(Duration(milliseconds: 2000));        //返回值以结束刷新        return Future.value(true);      },      child: buildNestedScrollView(),    ),  );}

RefreshIndicator 是一个下拉刷新组件,用来触发下拉刷新效果,直接嵌套NestedScrollView滑动布局来使用

//NestedScrollView 的基本使用Widget buildNestedScrollView() {  //滑动视图  return NestedScrollView(    //配置可折叠的头布局    headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {      return [buildSliverAppBar()];    },    //页面的主体内容    body: buidChildWidget(),  );}

NestedScrollView 中包含两部分,一部分是折叠的头部,使用SliverAppBar来实现,另一部分是滑动切换的页面主体 使用 TabBarView 来实现

  //通常在用到 PageView + BottomNavigationBar 或者 TabBarView + TabBar 的时候  //大家会发现当切换到另一页面的时候, 前一个页面就会被销毁, 再返回前一页时, 页面会被重建,  //随之数据会重新加载, 控件会重新渲染 带来了极不好的用户体验.  //由于TabBarView内部也是用的是PageView, 因此两者的解决方式相同  //页面的主体内容  Widget buidChildWidget() {    return TabBarView(      controller: tabController,      children: <Widget>[        ItemPage1(1),        ItemPage1(2),        ItemPage1(3),      ],    );  }

SliverAppBar 的实现如下:

//flexibleSpace可折叠的内容区域buildSliverAppBar() {  return SliverAppBar(    title: buildHeader(),    //标题居中    centerTitle: true,    //当此值为true时 SliverAppBar 会固定在页面顶部    //当此值为fase时 SliverAppBar 会随着滑动向上滑动    pinned: true,    //当值为true时 SliverAppBar设置的title会随着上滑动隐藏    //然后配置的bottom会显示在原AppBar的位置    //当值为false时 SliverAppBar设置的title会不会隐藏    //然后配置的bottom会显示在原AppBar设置的title下面    floating: false,    //当snap配置为true时,向下滑动页面,SliverAppBar(以及其中配置的flexibleSpace内容)会立即显示出来,    //反之当snap配置为false时,向下滑动时,只有当ListView的数据滑动到顶部时,SliverAppBar才会下拉显示出来。    snap: false,    elevation: 0.0,    //展开的高度    expandedHeight: 380,    //AppBar下的内容区域    flexibleSpace: FlexibleSpaceBar(      //背景      //配置的是一个widget也就是说在这里可以使用任意的      //Widget组合 在这里直接使用的是一个图片      background: buildFlexibleSpaceWidget(),    ),    bottom: buildFlexibleTooBarWidget(),  );}

SliverAppBar中有三部分,第一部分是标题部分,通过title属性配置,代码如下:

//构建SliverAppBar的标题titlebuildHeader() {  //透明组件  return Container(    width: double.infinity,    padding: EdgeInsets.only(left: 10),    height: 38,    decoration: BoxDecoration(      color: Colors.white,      border: Border.all(color: Colors.white),      borderRadius: BorderRadius.circular(30),    ),    child: Row(      mainAxisAlignment: MainAxisAlignment.center,      children: [        Icon(          Icons.search_rounded,          size: 18,        ),        SizedBox(          width: 4,        ),        Text(          "搜索",          style: TextStyle(            fontSize: 14,          ),        ),      ],    ),  );}

第二部分就是用来折叠部分的轮播图,通过 flexibleSpace 属性配置的FlexibleSpaceBar中配置,代码如下:

buildFlexibleSpaceWidget() {   return Column(     children: [       Container(         height: 240,         child: BannerHomepage(isTitle: false,),       ),       Container(         child: Row(           children: [             Expanded(               child: Container(                 height: 120,                 color: Colors.blueGrey,                 child: Image.asset("images/banner5.jpeg"),               ),             ),             Expanded(               child: Container(                 color: Colors.brown,                 height: 120,                 child: Image.asset("images/banner6.jpeg"),               ),             ),           ],         ),       )     ],   ); }

BannerHomepage 的实现在这里 Flutter Pageview 实现的轮播图

第三部分就是通过 bottom 配置的 TabBar 标签栏,在这里结合 PreferredSize 来使用,代码如下:

  //[SliverAppBar]的bottom属性配制  Widget buildFlexibleTooBarWidget() {    //[PreferredSize]用于配置在AppBar或者是SliverAppBar    //的bottom中 实现 PreferredSizeWidget    return PreferredSize(      //定义大小      preferredSize: Size(MediaQuery.of(context).size.width, 44),      //配置任意的子Widget      child: Container(        alignment: Alignment.center,        child: Container(          color: Colors.grey[200],          //随着向上滑动,TabBar的宽度逐渐增大          //父布局Container约束为 center对齐          //所以程现出来的是中间x轴放大的效果          width: MediaQuery.of(context).size.width,          child: TabBar(            controller: tabController,            tabs: [              new Tab(                text: "标签一",              ),              new Tab(                text: "标签二",              ),              new Tab(                text: "标签三",              ),            ],          ),        ),      ),    );  }

点击查看原文来获取源码。

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

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

相关文章

神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)

折线图&#xff08;Line Chart&#xff09;&#xff1a; 散点图的基础上&#xff0c;将相邻的点用线段相连接 plot()函数 #折线图&#xff1a;在散点图的基础上将相邻两个点链接 #描述变量变化的趋势 #plot(x,y,color,marker,label,linewidth,markersize) #x数据点的x坐标 #y…

WinCE6.0的EBOOT概要

为一个新的硬件设备定制WinCE6.0操作系统&#xff0c;一般需要完成以下几个主要步骤&#xff1a; 1. 针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP)&#xff0c;BSP必须包括BOOTLOADER、OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动。…

Silverlight HTML5 Flash - RIA技术之三足鼎立

未来&#xff0c;“用户体验”将成为所有软件商业价值的首要衡量标准。拥有极好用户体验的RIA(富互联网应用)技术近些年来发展迅猛&#xff0c;其中以Silverlight、HTML5及Flash最受热捧。纵观&#xff0c;互联网上98%的计算机都有安装Flash&#xff1b;HTML5的新特性则强化了W…

将经纬度转换为以度为单位的xy坐标

(LEFT(A2,FIND("",A2)-1))MID(A2,FIND("",A2)1,FIND("′",A2)-FIND("",A2)-1)/60MID(A2,FIND("′",A2)1,FIND("″",A2)-FIND("′",A2)-1)/3600 (LEFT(B2,FIND("",B2)-1))MID(B2,FIND("&…

python i开发工具_Python轻量级开发工具Genay使用

Genay是一个轻量级的免费&#xff0c;开放源代码的开发工具&#xff0c;支持很多的文件类型&#xff0c;并且支持很多的插件&#xff0c;启动快速。安装包只有十几兆&#xff0c;相比pycharm专业版需要收费&#xff0c;并且社区版的安装包大小有两百多兆&#xff0c;对于python…

wince 常见问题 1

1 在mediaplayer全屏播放的时候&#xff0c;我可以用键盘上的某一个键调节声音大小&#xff0c;现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多&#xff0c; 当声音变小的时候就减少 得到播放窗口的DC&#xff0c;然后在上面显示…

高服从编纂器 VIM-操作篇(1)

Toy Posted in Featured Post, Text Editor, Tutorials固然从好久前就开始用 VIM 了&#xff0c;但不绝都是半调吊子&#xff0c;翻来覆去只用自身会的饬令。最近为了提高誊写代码的服从&#xff0c;另有 coding 时分的兴味&#xff0c;又从新研讨了一下 VIM&#xff0c;发明白…

S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST

S3C2440一般默认的是一个USB DEVICE&#xff0c;一个USB HOST&#xff0c;即一个主口&#xff0c;一个从口&#xff0c;先来看看USB Device与USB Host相关知识。 USB Host&#xff1a; 最底层就是USB Host控制器了&#xff0c;上层是USB Host Controller Driver&#xff0c;该…

累积分布函数_C7: 概率函数和分布函数Distribution Function

》》点赞&#xff0c;收藏关注&#xff0c;理财&技术不迷路《《以下定义都是针对离散型随机变量的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;概率质量函数Probability Mass Function PMF&#xff08;只有离散型有&#xff09;&#xff1a;概率函数&…

arcgis拆分多部件要素

我们在项目中经常会遇到明明是多个要素&#xff0c;结果偏偏是一个&#xff0c;如下图 解决: 1.开启编辑 2.在编辑器中打开高级编辑 3.点击要拆分的要素&#xff0c;进行拆分多部件要素 4.拆分结果如下

维护IBM DB2数据库所应领会的基本常识-8

81.表的类型有哪些? 基本表 后果表 撮要表 类型表 子类型 子表 声明的暂且表 琐屑暂且表 82.怎样定义序列? CREATESEQUENCEORDERSEQSTARTWITH1INCREMENTBY1NOMAXVALUENOCYCLECACHE24 83.怎样将表置于检查挂起形态? SETINTEGRITYTABLE_NAMEOFF    84.怎样取得…

wince6.0驱动开发

1、基础知识&#xff1a; 1&#xff09;系统调用是操作系统内核和应用程序之间的接口&#xff0c;设备驱动程序是操作系统内核和机器硬件之间的接 口。设备驱动程序为应用程序屏蔽了硬件细节&#xff0c;在应用程序看来硬件只是一个设备文件&#xff0c;应用程序可以 像操作普通…

在android studio中如何创建一个类来继承另外一个类_在Android使用Transition API检测用户活动...

在当今世界&#xff0c;移动设备是我们日常生活中必不可少的一部分&#xff0c;我们在走路、跑步、开车以及其他许多活动时都会使用移动设备。了解用户拿着手机的时候在做什么&#xff0c;可以让你的应用程序根据用户的动作进行直观的调整。对于某些应用程序&#xff0c;确定用…

拼接dem,山地出现平地

利用dem做山体阴影&#xff0c;错误示例&#xff1a; 解决办法&#xff1a; 调整以下参数即可

先容Oracle中null的运用要领。

51 本源&#xff1a;网海拾贝 问&#xff1a;什么是NULL&#xff1f; 答&#xff1a;在我们不晓得详细有什么数据的时分&#xff0c;也即未知&#xff0c;可以用NULL&#xff0c;我们称它为空&#xff0c;ORACLE中&#xff0c;含有空值的表列长度为零。 ORACLE许可任何一种数据…

Wince6 Eboot中加入开机画面

昨天研究了一下wince开机时加入个性化的画面&#xff0c;折腾了一上午&#xff0c;不是花屏就是CE起不来……终于搞定&#xff0c;分享一下经验吧。。。 Wince加入开机画面方法一般有以下两种&#xff1a; 1、 在文件中下定义一个常量大数组&#xff0c;几百K&#xff0c;如con…

hive 窗口函数_Datatist科技专栏 | Hive排序窗口函数速学教程!

作者&#xff1a;原上野设计&#xff1a;Cindy编辑&#xff1a;AI君在开发过程中经常会遇见排序的场景&#xff0c;比如取top N的问题&#xff0c;这时候row_number(),rank,dense_ran()这三个函数就派上用场了&#xff0c;其中&#xff0c;row_number()最为常用。虽然都可以排序…

arcgis利用python赋值

、 rec0 def autoIncrement(): global rec pStart 1 pInterval 1 if (rec 0): rec pStart else: rec rec pInterval return rec

人生九度

1.工作方面&#xff0c;能力不敌态度&#xff1b; 2.事业方面&#xff0c;才华不敌韧度&#xff1b; 3.知识方面&#xff0c;广博不敌深度&#xff1b; 4.思想方面&#xff0c;敏锐不敌高度&#xff1b; 5.做人方面&#xff0c;精明不敌气度&#xff1b; 6.做事方面&#xff0c…