Flutter學習筆記(17)--頂部導航TabBar、TabBarView、DefaultTabController

来源:https://www.cnblogs.com/upwgh/archive/2019/08/17/11369537.html
-Advertisement-
Play Games

上一篇我們說了BottmNavigationBar底部導航組件,今天來學習一下頂部導航組件TabBar,TabBar選項卡一般位於AppBar下方,通常和TabBar(頂部導航選項卡)一起使用的有TabBarView和TabController。 TabBar:Tab頁的選項組件,預設為水平排... ...


如需轉載,請註明出處:Flutter學習筆記(17)--頂部導航TabBar、TabBarView、DefaultTabController

 上一篇我們說了BottmNavigationBar底部導航組件,今天來學習一下頂部導航組件TabBar,TabBar選項卡一般位於AppBar下方,通常和TabBar(頂部導航選項卡)一起使用的有TabBarView和TabController。

TabBar:Tab頁的選項組件,預設為水平排列。

TabBarView:Tab頁的內容容器,Tab頁內容一般處理為隨選項卡的改變而改變。

TabController:TabBar和TabBarView的控制器,它是關聯這兩個組件的橋梁。

TabBar組件常見屬性
屬性名 類型 說明
isScrollable bool 是否可以水平移動
tabs List<Widget> Tab選項列表

 

 

 

 

 

Tab組件常見屬性
屬性名 類型 說明
icon Widget Tab圖標
text String Tab文本

 

 

 

 

 

TabBarView組件常見屬性
屬性名 類型 說明
controller TabController 指定視圖的控制器
children List<Widget> 視圖組件的child為一個列表,一個選項卡對應一個視圖

 

 

 

 

 

 

上面我們說的TabController,與其併列的還有DefaultTabController,兩者的區別是TabController一般放在有狀態組件中使用,而DefaultTabController一般放在無狀態組件中使用。

下麵通過DefalutTabController來關聯TabBar和TabBarView來實現一個Demo:


import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget{
final List<Tab> _myTabs = <Tab>[
Tab(text: '選項一',icon: Icon(Icons.add_shopping_cart),),
Tab(text: '選項二',icon: Icon(Icons.wifi_tethering),),
Tab(text: '選項三',icon: Icon(Icons.airline_seat_flat_angled),)
];
@override
Widget build(BuildContext context) {
return new MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TabBar Demo',
home: new Scaffold(
body: DefaultTabController(
length: _myTabs.length,
initialIndex: 1,
child: Scaffold(
appBar: new AppBar(
title: new Text('TabBar Demo'),
leading: Icon(Icons.menu),
actions: <Widget>[
Icon(Icons.search)
],
bottom: new TabBar(
tabs: _myTabs,
indicatorColor: Colors.black,
indicatorWeight: 5,
indicatorSize: TabBarIndicatorSize.label,
labelColor: Colors.limeAccent,
unselectedLabelColor: Colors.deepOrange,
),
),
body: new TabBarView(
children: _myTabs.map((Tab tab){
return Center(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(Icons.tab),
Text(tab.text)
],
),
);
}).toList(),
),
)
),
),
);
}
}
 

 

 

效果截圖:

接下來分別看一下DefaultTabController、TabBar、TabBarView的構造函數有什麼:

  • DefaultTabController
  const DefaultTabController({
    Key key,
    @required this.length,
    this.initialIndex = 0,
    @required this.child,
  }) : assert(initialIndex != null),
       super(key: key);

 

  • TabBar
  const TabBar({
    Key key,
    @required this.tabs,//顯示的標簽內容,一般使用Tab對象,也可以是其他Widget
    this.controller,//TabController對象
    this.isScrollable = false,//是否可以滾動
    this.indicatorColor,//指示器顏色
    this.indicatorWeight = 2.0,//指示器的高度
    this.indicatorPadding = EdgeInsets.zero,//指示器底部的padding
    this.indicator,//指示器decoration,例如邊框等
    this.indicatorSize,//指示器大小的計算方式,TabBarIndicatorSize.tab:跟每個tab等寬,TabBarIndicatorSize.label:跟文字等寬
    this.labelColor,//選中label的顏色
    this.labelStyle,//選中label的樣式
    this.labelPadding,每個label的padding
    this.unselectedLabelColor,//未選中label的顏色
    this.unselectedLabelStyle,//未選中label的樣式
  }) : assert(tabs != null),
       assert(isScrollable != null),
       assert(indicator != null || (indicatorWeight != null && indicatorWeight > 0.0)),
       assert(indicator != null || (indicatorPadding != null)),
       super(key: key);

 

  • TabBarView
  const TabBarView({
    Key key,
    @required this.children,//Tab頁內容組件的數組集合
    this.controller,//TabController對象
    this.physics,
  }) : assert(children != null), super(key: key);

 

總結一下使用吧:一般流程就是初始化tabs的List列表,先把選項卡的選項初始化出來,接下來就是DefaultTabController把TabBar和TabBarView關聯起來,最後就是給TabBar和TabBarView設置各種屬性來滿足需求。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考:https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/api_concepts.html DataSet and DataStream Flink具有特殊類DataSet和DataStream來表示程式中的數據。 你可以 ...
  • 比爾·蓋茨在上世紀80年代說的“640K ought to be enough for anyone” 也就是“640K記憶體對哪個人來說都夠用了” 那個年代,微軟開發的還是DOS操作系統,程式員們還在絞盡腦汁,想要用好這極為有限的640K記憶體 而現在,我手頭的Mac Book Pro已經是16G記憶體 ...
  • 本機到本機的配置: 源端 10.1.83.144:1521/SIBP_GSDY HNSIB_GSDY目標端 10.1.83.144:1521/SIBP_GS HNSIB_GS進程名規劃 :OBB05 源端抽取進程及文件首碼:BG01_DY DY 目標端恢復進程:OBR01 //環境變數設置#for ...
  • 首先在edelivery中下載Oracle Linux 8.0然後就預設安裝系統環境準備工具目前不支持OL8,所以需要手動安裝,首先設置內核參數,在/etc/sysctl.conf追加[root@localhost ~]# cat /etc/sysctl.conf |grep -v ^#|grep ... ...
  • MySQL是一個小巧玲瓏但功能強大的資料庫,目前十分流行。但是官網給出的安裝包有兩種格式,一個是msi格式,一個是zip格式的。很多人下了zip格式的解壓發現沒有setup.exe,面對一堆文件一頭霧水,不知如何安裝。下麵筆者將介紹如何解決此情況下安裝過程中的各種問題 MySQL是一個小巧玲瓏但功能 ...
  • [學習筆記] JDBC是什麼? JDBC即(java database connectivity數據連接)。JDBC是Sun公司編的一堆類和方法,都封裝在java.sql包中。你可以利用這堆類和方法來把你的程式和資料庫連通。 JDBC的優點:跨資料庫性 通過使用JDBC,開發人員可以將SQL語句傳送 ...
  • 本文詳細介紹四種事務隔離級別,並通過舉例的方式說明不同的級別能解決什麼樣的讀現象。並且介紹了在關係型資料庫中不同的隔離級別的實現原理。 在DBMS中,事務保證了一個操作序列可以全部都執行或者全部都不執行(原子性),從一個狀態轉變到另外一個狀態(一致性)。由於事務滿足久性。所以一旦事務被提交之後,數據 ...
  • [TOC] MySQL下載安裝與配置 在IT行業不要輕易地嘗試最新版本的軟體(新版本可能有未知bug,bug的解決方案網上可能還不多,如果讓你碰上了...對吧?) 官網下載(後面有鏡像倉庫下載) 打開 "官網" DOWNLOADS Community Mysql Community Edition ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...