Flutter NestedScrollView实现的一个经典滑动折叠头部图片的效果

简介: Flutter是谷歌推出的最新的移动开发框架。Flutter NestedScrollView 滑动组件是用来处理复杂情况下的滑动应用场景,如向上滑动视图时,要折叠隐藏一部分内容,这时候就需要使用到 NestedScrollView 与 SliverAppBar 的结合使用。

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


Flutter是谷歌推出的最新的移动开发框架。
Flutter NestedScrollView 滑动组件是用来处理复杂情况下的滑动应用场景,如向上滑动视图时,要折叠隐藏一部分内容,这时候就需要使用到 NestedScrollView 与 SliverAppBar 的结合使用。

在本节中是使用 NestedScrollView 结合 SliverAppBar 与 TabBar 、TabBarView 实现的折叠头部效果


【x1】微信公众号的每日提醒 随时随记 每日积累 随心而过

【x2】各种系列的视频教程 免费开源 关注 你不会迷路

【x3】系列文章 百万 Demo 随时 复制粘贴 使用

【x4】本文章对应的讲解视频在这里

【x5】本文章的全部代码在这里


本 Demo 实现的最终效果如下:
在这里插入图片描述

首先页面的主体 使用的是 Scaffold 脚手架来构建,因为使用到了 TabBar 与 TabBarView ,标签的左右切换是一个动画效果,所以这里也使用到了SingleTickerProviderStateMixin , 代码如下:

class NetScrollHomePage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return ScrollHomePageState();
  }
}

class ScrollHomePageState extends State with SingleTickerProviderStateMixin {



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(title: Text(" 配制"),),
      /// 处理滑动
      body: buildNestedScrollView(),
    );
  }

buildNestedScrollView 方法就是构建了一个滑动布局 NestedScrollView ,其中两部分,头部使用的是 SliverAppBar 来触发折叠效果, body 用来配置页面主体部分,代码如下:

 ///构建滑动布局
 ///如下图1-1所示
 NestedScrollView buildNestedScrollView() {
   return NestedScrollView(
     headerSliverBuilder: (BuildContext context, bool b) {
       return [
         SliverAppBar(
           ///true SliverAppBar 不会滑动
           pinned: true,
           ///是否随着滑动隐藏标题
           floating: true,
           ///SliverAppBar展开的高度
           expandedHeight: 200,
           flexibleSpace: buildFlexibleSpaceBar(),
           bottom: buildTabBar(),
         ),
       ];
     },
     ///主体部分
     body: buildTabBarView(),
   );
 }

在这里插入图片描述
body对应的是页面主体部分,使用 TabBarView 装载了三个 Widget ,当然在实际应用场景中,你也可以使用独立的 StatefulWidget 来使用,代码如下:

TabBarView buildTabBarView() {
   return TabBarView(
     controller: tabController,
     children: <Widget>[
       SingleChildScrollView(
         child: Container(
           alignment: Alignment.bottomLeft,
           child: Text("这是第一个页面"),
           height: 1000,
         ),
       ),
       Text(
         "这是第二个页面",
         style: TextStyle(color: Colors.blue),
       ),
       Text(
         "这是第三个页面",
         style: TextStyle(color: Colors.red),
       ),
     ],
   );
 }

当然这里使用到了一个 TabController ,是在 初始化函数中 initState 中创建的,代码如下:

TabController tabController;

@override
void initState() {
  super.initState();
  ///这里的 3 代表有三个子 Item
  ///应用到 TabBarView 中,对应其中3个子Item
  ///应用到 TabBar中,对应其中32上子Item
  tabController = new TabController(length: 3, vsync: this);
}

上述创建的 TabController 是绑定 TabBarView 与 TabBar 的联动的,当然 TabBar是配置在 SliverAppBar 中的 bottom 属性下,通过 buildTabBar 方法来封装的, 代码如下:

TabBar buildTabBar() {
   return TabBar(
     controller: tabController,
     tabs: <Widget>[
       new Tab(
         text: "标签一",
       ),
       new Tab(
         text: "标签二",
       ),
       new Tab(
         text: "标签三",
       ),
     ],
   );
 }

最后就是折叠隐藏部分的图片部分,是在 SliverAppBar 的 flexibleSpace 属性中配置的,当然就是使用了 FlexibleSpaceBar,代码如下:

String imageUrl =
     "https://timgsa.baidu.com/timg?demo.image&quality=80&size=b9999_10000&sec=1578583093&di=0bf687d9589dc5c6c0778de9576ee077&imgtype=jpg&er=1&src=http%3A%2F%2Ffile.mumayi.com%2Fforum%2F201403%2F28%2F111010vhgc45hkh41f1mfd.jpg";

 FlexibleSpaceBar buildFlexibleSpaceBar() {
   return FlexibleSpaceBar(
//                title: Text("FlexibleSpaceBar title"),
     centerTitle: true,
     background: Container(
       color: Colors.blue[300],
       child: Column(
         mainAxisSize: MainAxisSize.min,
         children: <Widget>[
           Container(
             height: 150,
             child: Image.network(
               imageUrl,
               fit: BoxFit.fill,
               height: 160,
               width: 400,
             ),
           ),
         ],
       ),
     ),
   );
 }

完毕

当然 以小编的性格,是必须有源码的:本文章的全部代码在这里

相关文章
|
10月前
|
前端开发 机器人 数据安全/隐私保护
Flutter笔记:手写并发布一个人机滑动验证码插件
写 Flutter 项目时,遇到需要滑块验证码功能。滑块验证码属于人机验证码的一种,看起来像是在一个图片中“挖去”了一块,然后通过用户手动操作滑块,让被“挖去”的部分移回来。由于我不想使用各种第三方模块,因此决定自己实现一个初版以后慢慢添砖加瓦。本文是对第一个版本的一点记录。
273 1
Flutter笔记:手写并发布一个人机滑动验证码插件
|
10月前
|
缓存 Java 开发工具
Flutter的文本、图片和按钮使用
Flutter的文本、图片和按钮使用
103 0
|
11月前
|
存储 前端开发 文件存储
Flutter笔记:关于应用程序中提交图片作为头像
1. 头像选择与提交的一般步骤Flutter笔记关于应用程序中提交图片作为头像作者目 录1. 头像选择与提交的一般步骤2. 选择本地文件到头像的示例代码3. 将图像提交到后端1. 头像选择与提交的一般步骤image将处理后的图像作为用户的头像显示在应用程序中。您可以使用Image或小部件来加载和显示图像。这些步骤涵盖了从选择图像到上传、处理和显示图像的基本流程。请根据您的具体需求和后端实现来自定义这些步骤。此外,确保您的应用程序有适当的权限以访问设备上的相册或相机,这通常需要在和。
253 0
|
8天前
|
缓存
Flutter Image从网络加载图片刷新、强制重新渲染
Flutter Image从网络加载图片刷新、强制重新渲染
16 1
|
9天前
|
UED
Flutter之ListView实现自动滑动到底部
Flutter之ListView实现自动滑动到底部
20 1
|
1月前
Flutter-自定义折叠流布局实现
Flutter-自定义折叠流布局实现
29 0
|
1月前
|
Shell Android开发 Python
Flutter如何正确使用图片资源
Flutter如何正确使用图片资源
14 0
|
1月前
Flutter-自定义图片3D画廊
Flutter-自定义图片3D画廊
39 0
|
3月前
flutter 引用图片资源遇到的问题
flutter 引用图片资源遇到的问题
34 1
|
3月前
|
XML JSON 前端开发
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载
【4月更文挑战第30天】Flutter是谷歌的开源前端框架,因其高性能、流畅UI和多端运行能力受开发者喜爱。本文聚焦于Flutter中的资源加载:使用`Image`组件加载静态、网络和本地图片;通过`video_player`库加载和播放视频;利用`http`包进行网络资源请求。掌握这些技巧将有助于提升Flutter应用的开发效率和质量。
36 0
【Flutter前端技术开发专栏】Flutter中的图片、视频与网络资源加载