您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進(jìn)行Flutter仿頭條頂部tab切換實現(xiàn),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
今天主要實現(xiàn)一個仿頭條頂部tab
切換實現(xiàn),這種效果在項目中同樣經(jīng)常用到, 接下來我們就從頭開始實現(xiàn)。
老規(guī)矩,開局先上效果圖。
要實現(xiàn)這樣的效果,需要使用TabBar
進(jìn)行實現(xiàn)。我們先講一下TabBar
的基本屬性。
TabBar
是屬于AppBar
中的一個組件,通常和TabBarView
結(jié)合使用。
const TabBar({ Key key, @required this.tabs, this.controller, this.indicatorColor, this.labelColor, this.unselectedLabelColor, })
屬性名 | 屬性值類型 | 說明 |
---|---|---|
tabs | Tab類型的控件集合 | 要顯示的所有tab子項 |
controller | TabController類型 | 主要用來監(jiān)聽tab的切換 |
indicatorColor | Color | tab子項指示器的顏色 |
labelColor | Color | 子項文字的顏色 |
unselectedLabelColor | Color | 未選中子項文字的顏色 |
const TabBarView({ Key key, @required this.children, this.controller, })
屬性名 | 屬性值類型 | 說明 |
---|---|---|
children | Widget的集合 | 對應(yīng)TabBar每個子項要顯示的具體內(nèi)容 |
controller | TabController類型 | 主要用來監(jiān)聽tab的切換 |
接下來我們將使用兩種方式實現(xiàn)基本使用,第一種方式是配合DefaultTabController
使用,另外一種是配合 TabController
使用。在我們使用TabBar
的時候必須放在Scaffold
控件的AppBar
中,如果我們的App
中Scaffold
無法修改, 那我們需要在想要實現(xiàn)tab效果的頁面上包裹一層Scaffold
組件,要使用TabBar組件,必須為其指定TabController,要不然 會報錯,我們先看第一種實現(xiàn)方式,在Scaffold
組件外面包裹DefaultTabController
實現(xiàn)。
首先,我們先準(zhǔn)備需要切換的tab
子項的集合和對應(yīng)tab
子項的具體顯示內(nèi)容。
// 需要顯示的tab子項集合 final tabs = <Tab>[ Tab( text: "熱門", ), Tab( text: "新聞", ), ]; // 對應(yīng)上述tab切換后具體需要顯示的頁面內(nèi)容 final tabBarViews = <Widget>[ Center( child: Text("熱門Tab對應(yīng)的界面"), ), Center( child: Text("新聞Tab對應(yīng)的界面"), ), ];
然后再HomePage
頁面定義一個TabBar
實現(xiàn)。
DefaultTabController( length: tabs.length, // tab的個數(shù) child: Scaffold( appBar: AppBar( title: TabBar( tabs: tabs, ), ), body: TabBarView( children: tabBarViews, ), ), );
正常情況下,我們的TabBar
應(yīng)該是對應(yīng)appBar
中的bottom
屬性的,但此處我們卸載了title
屬性下,是因為我們上層已經(jīng) 有了一個appBar
了,如果再把TabBar
對應(yīng)的寫在appBar的bottom
屬性上,就會導(dǎo)致appBar
留有一個空白非常難看,效果如下。 所以我們定義在了title
屬性上。
上述實現(xiàn)方式有個局限,就是我們點擊切換tab
的時候,往往需要監(jiān)聽同時更改頁面狀態(tài)。所以我們以TabController
實現(xiàn)。 首先先看一下TabController
的構(gòu)造方法及屬性。
TabController({ int initialIndex = 0, @required this.length, @required TickerProvider vsync });
屬性名 | 屬性值類型 | 說明 |
---|---|---|
initialIndex | int | 初始選擇的tab下標(biāo) |
length | int | tab的個數(shù) |
vsync | TickerProvider | 提供動畫等行為 |
要實現(xiàn)能動態(tài)改變狀態(tài)的tab
切換效果必須先繼承StatefulWidget
,因為TabController
需要TickerProvider
,所以我們同時 讓我們state
類Mixins SingleTickerProviderStateMixin
這個類。從而更容易的實現(xiàn)TabController
,看一下具體的代碼實現(xiàn)。
class ThirdPage extends StatefulWidget { @override State createState() => _ThirdPageState(); } class _ThirdPageState extends State<ThirdPage> with SingleTickerProviderStateMixin { TabController _tabController; @override void initState() { super.initState(); _tabController = TabController(length: tabs.length, vsync: this); _tabController.addListener(() => print("當(dāng)前點擊的是第${_tabController.index}個tab")); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: TabBar( controller: _tabController, tabs: tabs, ), ), body: TabBarView( controller: _tabController, children: tabBarViews, ), ); } }
至此,我們的仿頭條tab
切換效果已經(jīng)實現(xiàn)了。
上述就是小編為大家分享的如何進(jìn)行Flutter仿頭條頂部tab切換實現(xiàn)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。