一、概述 NestedScrollView+TabBar+TabBarView实现TabBar滑动吸附在顶部。
二、开始编码 【Flutter|flutter控件----NestedScrollView+TabBar+TabBarView实现折叠顶部布局】本次代码以NestedScrollView(当然也可以用CustomScrollView实现,实现方法基本一致)的headerSliverBuilder实现滑动的顶部布局,其中SliverPersistentHeader实现吸附在顶部的TabBar。body中放TabBarView实现页面切换。(flutter的滑动家族还是值得好好学习一番的。此次代码是根据官网提供的例子而改写的)
以下代码注释还是挺详细的,
@override
Widget build(BuildContext context) {
double statusBarHeight = MediaQuery.of(context).padding.top;
///轮播图高度
double _swiperHeight = 326 + 10.0;
///提示头部高度
double _spikeHeight = 80;
///_appBarHeight算的是AppBar的bottom高度,kToolbarHeight是APPBar高,statusBarHeight是状态栏高度
double _appBarHeight =
_swiperHeight + _spikeHeight - kToolbarHeight - statusBarHeight;
return NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),///SliverAppBar也可以实现吸附在顶部的TabBar,但是高度不好计算,总是会有AppBar的空白高度,
///所以我就用了SliverPersistentHeader来实现这个效果,SliverAppBar的bottom中只放TabBar顶部的布局
child: SliverAppBar(
backgroundColor: Color(0xfff1f1f1),
forceElevated: innerBoxIsScrolled,
bottom: PreferredSize(
child: Container(),
preferredSize: Size.fromHeight(_appBarHeight)),///TabBar顶部收缩的部分
flexibleSpace: Column(
children: [
_swiper(),
_spike(),
],
),
),
),///停留在顶部的TabBar
SliverPersistentHeader(
delegate: _SliverAppBarDelegate(_timeSelection()),
pinned: true,
),
];
},
body: TabBarView(controller: _timeTabController, children: [
_listItem(),
_listItem(),
_listItem(),
_listItem(),
_listItem(),
_listItem(),
]),
);
}
///TabBar的代理
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
_SliverAppBarDelegate(this._tabBar);
final Stack _tabBar;
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return _tabBar;
}@override
double get maxExtent => 55;
@override
double get minExtent => 55;
@override
bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
return true;
}
}
三、总结 吸附顶部的TabBar效果搞了我一整天,尝试了各种办法,兜兜转转发现还是NestedScrollView的实现方式比较简单。但是其中的SliverAppBar的吸附效果搞得我实在头疼,高度总是计算失误,没有默认APPBar的SliverAppBar顶部总是有一段空白,最后没办法只能转变方式,利用SliverPersistentHeader来实现吸附功能,SliverAppBar中只存放顶部的布局。不管中间怎么折腾,能抓住耗子的就是好猫,这也不失为一种有效的解决办法吧。
源码下载
推荐阅读
- 回顾 Flutter 2021 重要时刻,奉上虎年红包封面喜迎新年!
- Flutter实现左侧边栏导航
- 如何在 Flutter 创建一个后台任务
- Flutter Convex Bottom 底部导航
- Flutter动态化框架Thresh
- 基于 Riverpod 的 Flutter 状态管理
- Flutter 2022 产品路线图发布
- Flutter 插件库
- Windows Running “flutter pub get“ in XXX卡死
- Flutter之下拉刷新,上拉加载更多