詳解Flutter TabLayout 布局用法
Flutter是谷歌的移動(dòng)UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面。 Flutter可以與現(xiàn)有的代碼一起工作。在全世界,F(xiàn)lutter正在被越來越多的開發(fā)者和組織使用,并且Flutter是完全免費(fèi)、開源的。
本文重點(diǎn)給大家介紹Flutter TabLayout 布局用法,具體內(nèi)容如下所示:
先上圖

頂部TabBar
使用 flutter create xxxx 創(chuàng)建一個(gè)項(xiàng)目
打開項(xiàng)目文件夾,在 lib 目錄里創(chuàng)建三個(gè) dart 文件,內(nèi)容分別如下
First.dart
import "package:flutter/material.dart";
class First extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.green,
);
}
}
Second.dart
import "package:flutter/material.dart";
class Second extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.red,
);
}
}
Third.dart
import "package:flutter/material.dart";
class Third extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.yellow,
);
}
}
修改 main.dart 文件內(nèi)容,TabLayout布局是個(gè)有狀態(tài)的組件,所以創(chuàng)建組件時(shí)要繼承 StatefulWidget 類
動(dòng)圖中的 TabBar 是在 Scaffold 中的 appBar 中定義的,也就是說 tabbar 是 appBar的一部分
appBar: AppBar( title: Text(widget.title), bottom: TabBar( controller: tabController, tabs: <Tab>[ new Tab(text: "問答"), new Tab(text: "分享"), new Tab(text: "博客"), ], ), ),
每個(gè) tabbar 對應(yīng)的視圖是在 body 里定義的,按照順序初始化好即可
// 引入 dart 文件 import 'First.dart' as first; import 'Second.dart' as second; import 'Third.dart' as third; body: TabBarView(controller: tabController, children: <Widget>[ new first.First(), new second.Second(), new third.Third(), ]),
完整代碼:
import 'package:flutter/material.dart';
import 'First.dart' as first;
import 'Second.dart' as second;
import 'Third.dart' as third;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'TabLayout Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage>
with SingleTickerProviderStateMixin {
TabController tabController;
@override
void initState() {
super.initState();
tabController = new TabController(length: 3, vsync: this);
}
@override
void dispose() {
super.dispose();
tabController.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
bottom: TabBar(
controller: tabController,
tabs: <Tab>[
new Tab(text: "問答"),
new Tab(text: "分享"),
new Tab(text: "博客"),
],
),
),
body: TabBarView(controller: tabController, children: <Widget>[
new first.First(),
new second.Second(),
new third.Third(),
]),
);
}
}
底部TabBar
上面定義的是頂部的tabbar,很多app的布局都是底部有見個(gè)tabbar,其實(shí)底部的定義方法就是將 appBar 屬性中的 bottom 給注釋掉,然后在跟 appBar 同級的位置定義一個(gè) bottomNavigationBar 屬性,其 child 就是 TabBar 組件,tabbar的視圖跟上面定義方法是一樣的,代碼如下
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
// bottom: TabBar(
// controller: tabController,
// tabs: <Tab>[
// new Tab(text: "問答"),
// new Tab(text: "分享"),
// new Tab(text: "博客"),
// ],
// ),
),
bottomNavigationBar: new Material(
color: Colors.blue,
child: TabBar(
controller: tabController,
indicatorColor: Colors.white,
tabs: <Tab>[
new Tab(text: "問答"),
new Tab(text: "分享"),
new Tab(text: "博客"),
],
),
),
body: TabBarView(controller: tabController, children: <Widget>[
new first.First(),
new second.Second(),
new third.Third(),
]),
);
}
這樣的布局長下面這個(gè)樣

參考
https://www.youtube.com/watch?v=3N27mjoBK2k
總結(jié)
以上所述是小編給大家介紹的ter TabLayout 布局用法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Netty源碼分析NioEventLoop線程的啟動(dòng)
這篇文章主要為大家介紹了Netty源碼分析NioEventLoop線程的啟動(dòng)示例,有需要的朋友,可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
字節(jié)碼調(diào)教入口JVM?寄生插件javaagent
這篇文章主要介紹了字節(jié)碼調(diào)教入口JVM?寄生插件javaagent方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
SpringBoot部署到外部Tomcat無法注冊到Nacos服務(wù)端的解決思路
這篇文章主要介紹了SpringBoot部署到外部Tomcat無法注冊到Nacos服務(wù)端,本文給大家分享完美解決思路,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-03-03
MyBatis insert語句返回主鍵和selectKey標(biāo)簽方式
這篇文章主要介紹了MyBatis insert語句返回主鍵和selectKey標(biāo)簽方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot關(guān)于自動(dòng)注入mapper為空的坑及解決
這篇文章主要介紹了SpringBoot關(guān)于自動(dòng)注入mapper為空的坑及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java面試重點(diǎn)中的重點(diǎn)之Elasticsearch核心原理
ElasticSearch是一個(gè)基于Lucene的搜索引擎,是用Java語言開發(fā)的,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定,可靠,快速,安裝使用方便,作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,是最受歡迎的企業(yè)搜索引擎2022-01-01
Java 大小寫最快轉(zhuǎn)換方式實(shí)例代碼
這篇文章主要介紹了Java 大小寫最快轉(zhuǎn)換方式實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-07-07

