1.使用效果

2.初始化tabs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @override void initState() { // TODO: implement initState super.initState(); _tabs = [ Tab( icon: Icon(Icons.map), text: "Tab1", ), Tab( icon: Icon(Icons.camera_alt), text: "Tab2", ), ]; } |
3.组件一定要是NestedScrollView,可以展示sleverAppBar
背景SliverAppBar
1 2 3 4 5 6 7 8 9 10 11 12 13 | ///背景图和title展示 SliverAppBar( pinned: true, //title固定在顶部不会滑动出屏幕 expandedHeight: 200, flexibleSpace: FlexibleSpaceBar( centerTitle: true, title: Text("TabViewTwo"), background: Image.asset( "assets/images/a.jpg", fit: BoxFit.cover, ), ), ), |
tabbar展示
首先创建_SliverAppBarDelegate继承SliverPersistentHeaderDelegate,融合tabbar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { final TabBar tabBar; _SliverAppBarDelegate(this.tabBar); @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { // TODO: implement build return Container( child: tabBar, ); } @override // TODO: implement maxExtent double get maxExtent => tabBar.preferredSize.height; @override // TODO: implement minExtent double get minExtent => tabBar.preferredSize.height; @override bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) { // TODO: implement shouldRebuild return false; } } |
展示
1 2 3 4 5 6 7 8 9 10 11 12 13 | ///tabbar展示 SliverPersistentHeader( delegate: _SliverAppBarDelegate( TabBar( tabs: _tabs, isScrollable: false, indicatorSize: TabBarIndicatorSize.label, labelColor: Colors.black87, unselectedLabelColor: Colors.grey, ), ), pinned: true, ) |
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import 'package:flutter/material.dart'; ///带有slever class TabViewTwo extends StatefulWidget { @override _TabViewTwoState createState() => _TabViewTwoState(); } class _TabViewTwoState extends State<TabViewTwo> { List<Tab> _tabs = []; @override void initState() { // TODO: implement initState super.initState(); _tabs = [ Tab( icon: Icon(Icons.map), text: "Tab1", ), Tab( icon: Icon(Icons.camera_alt), text: "Tab2", ), ]; } @override Widget build(BuildContext context) { return DefaultTabController( length: 2, child: Scaffold( body: NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return [ ///背景图和title展示 SliverAppBar( pinned: true, //title固定在顶部不会滑动出屏幕 expandedHeight: 200, flexibleSpace: FlexibleSpaceBar( centerTitle: true, title: Text("TabViewTwo"), background: Image.asset( "assets/images/a.jpg", fit: BoxFit.cover, ), ), ), ///tabbar展示 SliverPersistentHeader( delegate: _SliverAppBarDelegate( TabBar( tabs: _tabs, isScrollable: false, indicatorSize: TabBarIndicatorSize.label, labelColor: Colors.black87, unselectedLabelColor: Colors.grey, ), ), pinned: true, ) ]; }, body: TabBarView( children: ["hahhh", "哈哈哈哈"] .map((value) => Center( child: Text("$value"), )) .toList(), ), ), ), ); } } class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate { final TabBar tabBar; _SliverAppBarDelegate(this.tabBar); @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { // TODO: implement build return Container( child: tabBar, ); } @override // TODO: implement maxExtent double get maxExtent => tabBar.preferredSize.height; @override // TODO: implement minExtent double get minExtent => tabBar.preferredSize.height; @override bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) { // TODO: implement shouldRebuild return false; } } |
github地址:https://github.com/korolzhang/flutter_widget.git