直接上代码啦

import 'package:flutter/material.dart';

class StickyDemo extends StatefulWidget {

  @override
_StickyDemoState createState() => _StickyDemoState();
} class _StickyDemoState extends State<StickyDemo>
with SingleTickerProviderStateMixin {
TabController tabController; @override
void initState() {
super.initState();
this.tabController = TabController(length: 2, vsync: this);
} @override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
pinned: true,
elevation: 0,
expandedHeight: 250,
flexibleSpace: FlexibleSpaceBar(
title: Text('Sliver-sticky效果'),
background: Image.network(
'http://img1.mukewang.com/5c18cf540001ac8206000338.jpg',
fit: BoxFit.cover,
),
),
),
SliverPersistentHeader(
pinned: true,
delegate: StickyTabBarDelegate(
child: TabBar(
labelColor: Colors.black,
controller: this.tabController,
tabs: <Widget>[
Tab(text: 'Home'),
Tab(text: 'Profile'),
],
),
),
),
SliverFillRemaining(
child: TabBarView(
controller: this.tabController,
children: <Widget>[
Center(child: Text('Content of Home')),
Center(child: Text('Content of Profile')),
],
),
),
],
),
);
}
} class StickyTabBarDelegate extends SliverPersistentHeaderDelegate {
final TabBar child; StickyTabBarDelegate({@required this.child}); @override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return this.child;
} @override
double get maxExtent => this.child.preferredSize.height; @override
double get minExtent => this.child.preferredSize.height; @override
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
return true;
}
}

  

往下滑动效果图:

最后tab就吸附固定在顶部了;再往上滑动,顶部的图片就会出现了;

更详细的请看原博客 https://segmentfault.com/a/1190000019902201

这是一种实现方式,当然还有其他方式,他们三也可以实现NestedScrollViewRefreshIndicator、NestedScrollView和SliverPersistentHeader,以下代码是项目的代码,使用结构简单写下,其中有用到Bloc模式,但是和实现效果无关哈

NestedScrollViewRefreshIndicator(
onRefresh: onRefresh,
child: NestedScrollView(
headerSliverBuilder: (c, f) {
return buildSliverHeader(_appBarHeight, applicationBloc);
},
body: Column(
children: <Widget>[
primaryTabBar,
Expanded(
child: TabBarView(
  controller: this.tabController,
  children: <Widget>[
  Center(child: Text('Content of Home')),
  Center(child: Text('Content of Profile')),
  ],
  ),
),
],
),
),
), var primaryTabBar = Container(
height: 36,
child: TabBar(
labelColor: Colors.black,
controller: this.tabController,
tabs: <Widget>[
Tab(text: 'Home'),
 Tab(text: 'Profile'),
],
),
); List<Widget> buildSliverHeader(appBarHeight, applicationBloc) {
var widgets = <Widget>[];
widgets.add(
SliverPersistentHeader(
pinned: false,
delegate: _SliverAppBarDelegate(
Column(),
appBarHeight),
),
);
return widgets;
}

  

flutter,SliverPersistentHeader实现Tab顶部吸附固定效果的更多相关文章

  1. Android 滑动定位+吸附悬停效果实现

    在前两篇文章中,分别介绍了tablayout+scrollview 和 tablayout+recyclerview 实现的滑动定位的功能,文章链接: Android 实现锚点定位 Android t ...

  2. js div及table首行顶部吸附示例

    js div顶部吸附示例,例如这样: 以下为DIV顶部吸附示例:(此示例来自于网络,在此记录与分享!感谢原作者!) 示例1:兼容IE6 <div style="height:300px ...

  3. Stickup – 轻松实现元素固定效果的 jQuery 插件

    粘贴是一个简单的 jQuery 插件,在页面滚动的时候固定一个元素到浏览器窗口的顶部,让其总是保持在视图中可见.这个插件作用于多页的网站,但是对于单页的布局有额外的功能.借助 CSS,还可以实现当前视 ...

  4. 滚动页面时DIV到达顶部时固定在顶部

    本示例使用Javascript实现了滚动页面时,DIV到达顶部时固定在顶部.在IE下效果有点闪,效果网址:http://www.keleyi.com/keleyi/phtml/fixdiv.htm 下 ...

  5. 使用 Sticky-Kit 实现基于 jQuery 的元素固定效果

    元素固定效果在网页中应用得很多,比较常见的使用场景有改进导航,显示广告.Sticky-Kit 是一个非常方便的 jQuery 插件,简化了创建/管理粘元素,有复杂的使用功能.这些功能包括:处理多个固定 ...

  6. iOS开发之吸附动画效果

    步骤:1.使用singleviewapplication创建新的项目 2.在.h文件中创建两张图片的实例对象,并与相关的图片进行相连:创建一个UIDynamicAnimator实例对象 3.在.m文件 ...

  7. 模仿京东顶部搜索条效果制作的一个小demo

    最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 #define kScreenWidth [UIScreen mainScreen].bounds.s ...

  8. JS 实现DIV 滚动至顶部后固定

    JS 实现DIV 滚动至顶部后固定 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" ...

  9. Flutter——TabBar组件(顶部Tab切换组件)

    TabBar组件的常用属性: 属性 描述 tabs 显示的标签内容,一般使用 Tab 对象,也可以是其他的Widget  controller TabController 对象 isScrollabl ...

随机推荐

  1. eclipse3.7以后编译代码提示ambiguous 的解决方法

    Eclispe3.7以后在使用可变函数时可能会遇到这种编译错误的问题 The method is ambiguous 正确的解决方法是:  在eclipse.ini -vmargs后面添加  -Dto ...

  2. promise 极简版封装

    Promise 优点: 解决回调地狱, 对异步任务写法更标准化与简洁化 缺点: 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消; 其次,如果不设置回调函数,Promise内部抛出的 ...

  3. js获取url参数值的方法总结

    1.方式一:通过字符串截取的方式获取参数值: 1).函数一:获取URL中的参数名及参数值的集合 /** * [获取URL中的参数名及参数值的集合] * 示例URL:http://htmlJsTest/ ...

  4. 四种PHP异步执行的常用方式

    本文为大家讲述了php异步调用方法,分享给大家供大家参考,具体内容如下 客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果. 有时服务器需要执 ...

  5. 游戏设计模式——Unity事件队列(纪念京阿尼事件)

    “对消息或事件的发送与受理进行时间上的解耦.” 在游戏开发过程中,经常会出现不同板块之间的信息交流,或是存在“当...,就...”的情况,事件队列编程模式可以有效解决消息传递中产生的脚本耦合问题,让同 ...

  6. 【转】ASP.NET Core 如何设置发布环境

    在ASP.NET Core中自带了一些内置对象,可以读取到当前程序处于什么样的环境当中,比如在ASP.NET Core的Startup类的Configure方法中,我们就会看到这么一段代码: publ ...

  7. springboot热启动中那些不为人知的东东

    在springboot热启动中,大家都知道在pom文件中配置devtools,但是当这个服务特别大,或者引入的包特别多的时候,重启一下就特别慢,如果开发的PC的内存和cpu如果不给里的h话,系统就卡主 ...

  8. css 关于浮动float的使用以及清除浮动

    float:none | left | right 默认值:none 适用于:所有元素 none:设置对象不浮动left:设置对象浮在左边right:设置对象浮在右边 当该属性不等于none引起对象浮 ...

  9. 「SAP 技术」SAP BP显示供应商账户组时候的怪现象

    SAP BP显示供应商账户组时候的怪现象 BP事务代码显示某个vendor的时候,笔者发现对于账户组字段选项列表里,不显示当前vendor的account group. 如下图,该供应商的accoun ...

  10. linux远程桌面连接 VNC Server

    更新源 # sudo apt-get update 安装vnc4server # sudo apt-get install vnc4server 修改vnc远程连接密码 # vncpasswd 编辑v ...