html tab顶部吸附,flutter,SliverPersistentHeader实现Tab顶部吸附固定效果

本文介绍了一种在Flutter中实现粘性Tab栏的方法,利用CustomScrollView与Sliver组件组合来固定Tab栏在屏幕顶部,并展示了如何通过代码实现下拉刷新及滑动时背景图片与Tab栏之间的切换效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码啦

import 'package:flutter/material.dart';

class StickyDemo extends StatefulWidget {

@override

_StickyDemoState createState() => _StickyDemoState();

}

class _StickyDemoState extends State

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: [

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: [

Tab(text: 'Home'),

Tab(text: 'Profile'),

],

),

),

),

SliverFillRemaining(

child: TabBarView(

controller: this.tabController,

children: [

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;

}

}

往下滑动效果图:

e4df5f0879788e69675cfb7ba791dda5.gif

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

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

NestedScrollViewRefreshIndicator(

onRefresh: onRefresh,

child: NestedScrollView(

headerSliverBuilder: (c, f) {

return buildSliverHeader(_appBarHeight, applicationBloc);

},

body: Column(

children: [

primaryTabBar,

Expanded(

child: TabBarView(

controller: this.tabController,

children: [

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: [

Tab(text: 'Home'),

Tab(text: 'Profile'),

],

),

);

List buildSliverHeader(appBarHeight, applicationBloc) {

var widgets = [];

widgets.add(

SliverPersistentHeader(

pinned: false,

delegate: _SliverAppBarDelegate(

Column(),

appBarHeight),

),

);

return widgets;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值