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…

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

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

累积分布函数_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.拆分结果如下

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

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

拼接dem,山地出现平地

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

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

idea修改代码后没有重新编译_SpringBoot中实现代码修改之后的自动更新与热加载...

在实际的开发过程中&#xff0c;我们经常修改代码之后&#xff0c;手动的重启项目&#xff0c;查看修改效果。那么有没有一种方式能够快速的、自动的帮我们将修改代码自动更新&#xff0c;避免手动重启&#xff0c;从而提高开发效率呢&#xff1f;是有的&#xff0c;对于这个功…

WINCE6开机进度条

大致思路&#xff0c;在NBoot或EBoot加开机进度条&#xff0c;由于WINCE启动主要时间都花在读取NK&#xff0c;因此每读取一定的页&#xff0c;就在屏上画一条固定高度的线&#xff0c;并记录画线的位置&#xff0c;下次接着画&#xff0c;直到读取完NK&#xff0c;这样就产生的…

电脑查看wifi密码

右键 打开“网络。。。。。。”

软件oem要注意什么_做化妆品oem,选择化妆品包材要注意什么问题

化妆品企业找厂家做oem&#xff0c;一般厂家都是负责设计研发生产的&#xff0c;但是设计出来的产品包材&#xff0c;就需要找其它的包材厂家去采购了&#xff0c;很多没有经验的品牌商都不清楚找包材要怎么找&#xff0c;好看质量好就可以了吗&#xff1f;韵丽生物科技化妆品代…

等高线转dem

可以自行设置分辨率

登录验证应该是进行在客户端还是服务器端_网站登录认证方式

目前大部分软件系统资源访问都是使用HTTP协议&#xff0c;HTTP是无状态的协议&#xff0c;每次请求默认都是相互独立的。但是大部分情况下我们需要记录请求资源的用户信息&#xff0c;也就是保存会话&#xff0c;从而对资源的访问做限制&#xff0c;这是我们认证功能。常用的认…

arcgis将点的属性赋值给面

例子&#xff1a;将点的编号属性列赋值到对应的面属性

arcgis投影数据计算度分秒

原始数据投影坐标系 1.先将图层坐标改为地理坐标系 2.添加字段必须是文本类型&#xff0c;否则计算不出度分秒的形式&#xff0c;只显示十进制 错误示例&#xff08;字段类型为双精度&#xff09; 正确示例&#xff08;字段类型为文本类型&#xff09;