Flutter 滑動列表隱藏頭部 ListView+TabBar懸浮的實現(xiàn)

先來張效果圖

在這里插入圖片描述

我的需求是,列表滾動到頂部,Tabbar停留,置頂.

實際寫起來,繞了不少彎路.


最開始我使用的:

CustomScrollView

代碼如下:

import 'package:flutter/material.dart';


const url =
    'http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg';

class TestPage2 extends StatefulWidget {
  @override
  _TestPage2State createState() => _TestPage2State();
}

class _TestPage2State extends State<TestPage2> {
  var tabTitle = [
    '頁面1',
    '頁面2',
    '頁面3',
  ];

  @override
  Widget build(BuildContext context) {
    return new DefaultTabController(
        length: tabTitle.length,
        child: Scaffold(
          body: new CustomScrollView(
            slivers: <Widget>[
              new SliverAppBar(
                expandedHeight: 200.0,
                floating: true,
                pinned: true,
                flexibleSpace: FlexibleSpaceBar(
                    centerTitle: true,
                    title: Text(
                      "我是可以跟著滑動的title",
                    ),
                    background: Image.network(
                      url,
                      fit: BoxFit.cover,
                    )),
              ),
              new SliverToBoxAdapter(
                child: new TabBar(
                  tabs: tabTitle.map((f) => Tab(text: f)).toList(),
                  indicatorColor: Colors.red,
                  unselectedLabelColor: Colors.black,
                  labelColor: Colors.red,
                ),
              ),
              new SliverFillRemaining(
                child: TabBarView(
                  children: tabTitle
                      .map((s) => ListView.builder(
                            itemBuilder: (context, int) => Text("123"),
                            itemCount: 50,
                          ))
                      .toList(),
                ),
              )
            ],
          ),
        ));
  }
}


在這里插入圖片描述

雖然列表效果出來了,但不是我想要的,

列表滑動,不會聯(lián)動

使用SliverToBoxAdapter 并不會有聯(lián)動效果.因為它是固定的.

想要聯(lián)動,只有像NestedScrollView源碼里的

在這里插入圖片描述

使用自定義的PrimaryScrollController才行.
不過既然NestedScrollView已經(jīng)做,不是特別的需求,就用NestedScrollView就好了


正確的姿勢 NestedScrollView:

SliverAppBar

相當(dāng)于Appbar.不過是Sliver滾動家族里的

  new SliverAppBar(
                  expandedHeight: 200.0,
                  floating: true,
                  pinned: true,
                  flexibleSpace: FlexibleSpaceBar(
                      centerTitle: true,
                      title: Text(
                        "我是可以跟著滑動的title",
                      ),
                      background: Image.network(
                        url,
                        fit: BoxFit.cover,
                      )),
                ),

懸浮最關(guān)鍵的:SliverPersistentHeader

這個是可以聯(lián)動并且可以停留在頂部的
設(shè)置懸浮停留的屬性pinned.
這里需要自己實現(xiàn)一個Delegate.因為需要停留weight的高度.

 new SliverPersistentHeader(
                  delegate: new SliverTabBarDelegate(
                    new TabBar(
                      tabs: tabTitle.map((f) => Tab(text: f)).toList(),
                      indicatorColor: Colors.red,
                      unselectedLabelColor: Colors.black,
                      labelColor: Colors.red,
                    ),
                    color: Colors.white,
                  ),
                  pinned: true,
                ),

最終代碼:

import 'package:flutter/material.dart';

const url =
    'http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg';

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  var tabTitle = [
    '頁面1',
    '頁面2',
    '頁面3',
  ];

  @override
  Widget build(BuildContext context) {
    return new DefaultTabController(
        length: tabTitle.length,
        child: Scaffold(
          body: new NestedScrollView(
            headerSliverBuilder: (context, bool) {
              return [
                SliverAppBar(
                  expandedHeight: 200.0,
                  floating: true,
                  pinned: true,
                  flexibleSpace: FlexibleSpaceBar(
                      centerTitle: true,
                      title: Text(
                        "我是可以跟著滑動的title",
                      ),
                      background: Image.network(
                        url,
                        fit: BoxFit.cover,
                      )),
                ),
                new SliverPersistentHeader(
                  delegate: new SliverTabBarDelegate(
                    new TabBar(
                      tabs: tabTitle.map((f) => Tab(text: f)).toList(),
                      indicatorColor: Colors.red,
                      unselectedLabelColor: Colors.black,
                      labelColor: Colors.red,
                    ),
                    color: Colors.white,
                  ),
                  pinned: true,
                ),
              ];
            },
            body: TabBarView(
              children: tabTitle
                  .map((s) => ListView.builder(
                        itemBuilder: (context, int) => Text("123"),
                        itemCount: 50,
                      ))
                  .toList(),
            ),
          ),
        ));
  }
}

class SliverTabBarDelegate extends SliverPersistentHeaderDelegate {
  final TabBar widget;
  final Color color;

  const SliverTabBarDelegate(this.widget, {this.color})
      : assert(widget != null);

  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return new Container(
      child: widget,
      color: color,
    );
  }

  @override
  bool shouldRebuild(SliverTabBarDelegate oldDelegate) {
    return false;
  }

  @override
  double get maxExtent => widget.preferredSize.height;

  @override
  double get minExtent => widget.preferredSize.height;
}

最終效果

在這里插入圖片描述

題外話:

如果不使用TabBar+TabBarView
那么直接使用CustomScrollView就可以了.
使用SliverList代替ListView就可以進行聯(lián)動.


期待你的留言交流.

交流群: 782978118(flutter群) 493180098 (android群)

flutter開源項目地址:https://github.com/Jlanglang/yiball

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潜沦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子煮寡,更是在濱河造成了極大的恐慌懂傀,老刑警劉巖趾诗,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹬蚁,居然都是意外死亡恃泪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門犀斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來且警,“玉大人雕薪,你說我怎么就攤上這事∫查” “怎么了呢燥?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵夹厌,是天一觀的道長肺稀。 經(jīng)常有香客問我赘艳,道長,這世上最難降的妖魔是什么持钉? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任衡招,我火速辦了婚禮篱昔,結(jié)果婚禮上每强,老公的妹妹穿的比我還像新娘始腾。我一直安慰自己,他們只是感情好空执,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布浪箭。 她就那樣靜靜地躺著,像睡著了一般辨绊。 火紅的嫁衣襯著肌膚如雪奶栖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天门坷,我揣著相機與錄音宣鄙,去河邊找鬼。 笑死默蚌,一個胖子當(dāng)著我的面吹牛冻晤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绸吸,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼鼻弧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锦茁?” 一聲冷哼從身側(cè)響起攘轩,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎码俩,沒想到半個月后度帮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡稿存,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年够傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠铲。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡冕屯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拂苹,到底是詐尸還是另有隱情安聘,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布瓢棒,位于F島的核電站浴韭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脯宿。R本人自食惡果不足惜念颈,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望连霉。 院中可真熱鬧榴芳,春花似錦嗡靡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柿祈,卻和暖如春哈误,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躏嚎。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蜜自, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卢佣。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓袁辈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珠漂。 傳聞我的和親對象是個殘疾皇子晚缩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在很多人現(xiàn)在剛剛觸摸到AEO的概念時,其實AEO己經(jīng)開始更新?lián)Q代了媳危!雖然獲得海關(guān)審核通過高級認(rèn)證企業(yè)僅占在海關(guān)...
    徐頌閱讀 545評論 0 5
  • 正文 1. TCP與UDP: 在網(wǎng)絡(luò)體系結(jié)構(gòu)中我們提過TCP/IP的四層網(wǎng)絡(luò)層級: 而TCP(Transmisso...
    秀就完事了閱讀 503評論 0 0
  • 一直很喜歡蝸牛的精神荞彼,一步一步往前爬,從不放棄待笑。亦如人生鸣皂,永不言棄。 有人說“退一步海闊天空”暮蹂,那指的是心態(tài)寞缝,一種...
    一塵拾光閱讀 1,126評論 4 9
  • 一只 無名飛蟲 在客廳方形吊燈里 安靜的死著
    向日葵愛呀愛太陽閱讀 195評論 0 0