Flutter入門(17):Flutter 組件之 TabBarView 詳解

1. 基本介紹

TabBar赌蔑、TabBarView,TabController 提供了常見的多Tab切換的功能。本文接著 Flutter 組件之 TabBar 詳解繼續(xù)講解彻舰。

2. 示例代碼

代碼下載地址。如果對你有幫助的話記得給個關(guān)注候味,代碼會根據(jù)我的 Flutter 專題不斷更新。

3. 屬性介紹

TabBarView屬性 介紹
children 子頁面隔心,注意保持 TabBarView.children 數(shù)量白群、DefaultTabController.length, TabBar.tabs 三者數(shù)量相同硬霍。
controller TabController帜慢,聯(lián)動控制,下文中自行感受一下唯卖,可以關(guān)掉 TabBar 或者 TabBarView 的 controller 屬性感受一下粱玲。
physics 滑動效果,如滑動到末端時拜轨,繼續(xù)拉動抽减,使用 ClampingScrollPhysics 實(shí)現(xiàn)Android下微光效果。使用 BouncingScrollPhysics 實(shí)現(xiàn)iOS下彈性效果橄碾。
dragStartBehavior 啟動時阻尼效果卵沉,默認(rèn)為 DragStartBehavior.start

4. TabBarView 組件

4.1 容器創(chuàng)建

優(yōu)雅的編程,首先創(chuàng)建一個 tabbarview.dart 文件法牲。先直接創(chuàng)建一個 TabBar 組件史汗,Flutter 組件之 TabBar 詳解 已經(jīng)介紹的很詳細(xì)了,不多敘述拒垃。

import 'package:flutter/material.dart';

class FMTabbarViewVC extends StatefulWidget {
  @override
  FMTabbarViewState createState() => FMTabbarViewState();
}

class FMTabbarViewState extends State<FMTabbarViewVC> {
  var pageDatas = [];
  TabController controller;

  @override
  void initState(){
    super.initState();

    initData();
    controller = TabController(length: pageDatas.length, vsync: ScrollableState());
  }


  void initData(){
    pageDatas.add({"title":"一年級英語", "content":["我是一年級英語一班", "我是一年級英語二班","我是一年級英語三班"]});
    pageDatas.add({"title":"二年級英語", "content":["我是二年級英語一班", "我是二年級英語二班","我是二年級英語三班"]});
    pageDatas.add({"title":"三年級英語", "content":["我是三年級英語一班", "我是三年級英語二班","我是三年級英語三班"]});
    pageDatas.add({"title":"四年級英語", "content":["我是四年級英語一班", "我是四年級英語二班","我是四年級英語三班"]});
    pageDatas.add({"title":"五年級英語", "content":["我是五年級英語一班", "我是五年級英語二班","我是五年級英語三班"]});

    setState(() {

    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return DefaultTabController(
      length: pageDatas.length,
      child: Scaffold(
        appBar: AppBar(
          title: Text('TabBar'),
          bottom: _tabBar(),
        ),
        body: Container(
          color: Colors.grey,
        ),
      ),
    );
  }

  TabBar _tabBar(){
    return TabBar(
      tabs: _tabs(),
      isScrollable: true,
      indicatorColor: Colors.red,
      indicatorWeight: 5,
      controller: controller,
      onTap: (index){
        print("點(diǎn)擊了 index = ${index}");
      },
    );
  }

  List <Widget> _tabs(){
    List <Widget> tabList = [];
    pageDatas.forEach((page) {
      tabList.add(
        Tab(text: page["title"],),
      );
    });
    print(tabList);
    return tabList;
  }
}
tabbar.png

4.2 創(chuàng)建 TabBarView

  Widget build(BuildContext context) {
    // TODO: implement build
    return DefaultTabController(
      length: pageDatas.length,
      child: Scaffold(
        appBar: AppBar(
          title: Text('TabBar'),
          bottom: _tabBar(),
        ),
        body: _tabBarView(),
      ),
    );
  }

  TabBarView _tabBarView(){
    return TabBarView(
      children: _tabViews(),
      controller: controller,
    );
  }

  List <Widget> _tabViews(){
    List <Widget> tabViewList = [];
    pageDatas.forEach((page) {
      var contents = page["content"];
      tabViewList.add(
        ListView(
          children: _listViewChildren(contents),
        ),
      );
    });
    print(tabViewList);
    return tabViewList;
  }

  List <Widget> _listViewChildren(List contents){
    List <Widget> children = [];
    contents.forEach((content) {
      children.add(
          ListTile(title: Text("${content}"),)
      );
    });
    return children;
  }

到這里其實(shí)一個聯(lián)動的自定義數(shù)據(jù)的 tabBarView 已經(jīng)完成了停撞。


tabbarview one.png

tabbarview three.png

4.3 physics

使用 physics 完成一些物理效果,使用 ClampingScrollPhysics 實(shí)現(xiàn)Android下微光效果悼瓮。使用 BouncingScrollPhysics 實(shí)現(xiàn)iOS下彈性效果戈毒。

  TabBarView _tabBarView(){
    return TabBarView(
      children: _tabViews(),
      physics: BouncingScrollPhysics(

      ),
      controller: controller,
    );
  }

這里就不截圖了,建議滑到最后一頁繼續(xù)滑動感受一下谤牡。

4.4 dragStartBehavior

啟動阻尼副硅,默認(rèn)為 DragStartBehavior.start,還有個 DragStartBehavior.down翅萤,編譯后自行體驗(yàn)效果吧恐疲。

  TabBarView _tabBarView(){
    return TabBarView(
      children: _tabViews(),
      physics: BouncingScrollPhysics(

      ),
      dragStartBehavior: DragStartBehavior.down,
      controller: controller,
    );
  }

4.5 常見報錯

Controller's length property (5) does not match the number of tabs (1) present in TabBar's tabs property.
tabbarview error.png

注意:當(dāng) TabBarView.children 數(shù)量與 Tabs 數(shù)量不同時腊满,會報錯。注意保持 TabBarView.children 數(shù)量培己、DefaultTabController.length碳蛋, TabBar.tabs 三者數(shù)量相同。

5. 技術(shù)小結(jié)

  • TabBarView 的屬性較少省咨。
  • TabBarView.children 數(shù)量肃弟、DefaultTabController.length, TabBar.tabs 三者數(shù)量必須相同零蓉。
  • TabBarView 可以理解為一個特殊的容器笤受,主要的還是子控件的布局,可以使用任意組件敌蜂。
  • 使用好 TabController 控制聯(lián)動效果箩兽。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市章喉,隨后出現(xiàn)的幾起案子汗贫,更是在濱河造成了極大的恐慌,老刑警劉巖秸脱,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件落包,死亡現(xiàn)場離奇詭異,居然都是意外死亡摊唇,警方通過查閱死者的電腦和手機(jī)咐蝇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遏片,“玉大人嘹害,你說我怎么就攤上這事∷北悖” “怎么了笔呀?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長髓需。 經(jīng)常有香客問我许师,道長,這世上最難降的妖魔是什么僚匆? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任微渠,我火速辦了婚禮,結(jié)果婚禮上咧擂,老公的妹妹穿的比我還像新娘逞盆。我一直安慰自己,他們只是感情好松申,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布云芦。 她就那樣靜靜地躺著俯逾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舅逸。 梳的紋絲不亂的頭發(fā)上桌肴,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音琉历,去河邊找鬼坠七。 笑死,一個胖子當(dāng)著我的面吹牛旗笔,可吹牛的內(nèi)容都是我干的彪置。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蝇恶,長吁一口氣:“原來是場噩夢啊……” “哼悉稠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艘包,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耀盗,沒想到半個月后想虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叛拷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年舌厨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忿薇。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡裙椭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出署浩,到底是詐尸還是另有隱情揉燃,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布筋栋,位于F島的核電站炊汤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弊攘。R本人自食惡果不足惜抢腐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望襟交。 院中可真熱鬧迈倍,春花似錦、人聲如沸捣域。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至提完,卻和暖如春形纺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徒欣。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工逐样, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人打肝。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓脂新,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粗梭。 傳聞我的和親對象是個殘疾皇子争便,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348