こんにちは!本記事ではTabBarでページ遷移する方法について、サンプルコードと一緒に説明していきます。
作りたいもの
左の動画のように、下にTabBarを設置し、それぞれのTabBarを押すと該当するページやウィジェットが開かれるようになります。
サンプルコード
まず、サンプルコードを載せます。このコードをそのままmain.dartにコピペすれば動画通りのものが作れます。TabBarを使用するにあたって必要な構文などは次の章でそれぞれ説明していきます。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.purple,
),
home: Main(),
);
}
}
class Main extends StatefulWidget {
@override
_MainState createState() => _MainState();
}
class _MainState extends State<Main> with SingleTickerProviderStateMixin {
final List<Tab> tabs = <Tab>[
Tab(text: 'Home'),
Tab(text: 'History'),
Tab(text: 'World'),
];
late TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: tabs.length, vsync: this);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.purple.shade100,
title: Text("TabBar"),
),
bottomNavigationBar: TabBar(
tabs: tabs,
controller: _tabController,
unselectedLabelColor: Colors.grey,
indicatorColor: Colors.purple,
indicatorWeight: 3,
indicatorPadding: EdgeInsets.symmetric(horizontal: 18.0,
vertical: 8),
labelColor: Colors.black,
),
body: TabBarView(
controller: _tabController,
children:[
Text("Home"),
Text("History"),
Text("World")
]
)
);
}
}
TabBarを作る手順
それでは、TabBarを表示させるために必要な手順を説明していきます。
class に with SingleTickerProviderStateMixinを追加する
TabBarを設定するメインページで、下記のようにwith以下を記入します。
class _MainState extends State<Main> with SingleTickerProviderStateMixin {
}
SingleTickerProviderStateMixinとは、Animation Controllerを1つ使っている時に使います。TabControllerはAnimation Controllerに含まれるので、この宣言が必要です。
Tab()のリストを作成する
下のタブバー部分に表示するタブをリストにして宣言します。
final List<Tab> tabs = <Tab>[
Tab(text: 'Home'),
Tab(text: 'History'),
Tab(text: 'World'),
];
TabControllerを宣言する
late TabController _tabController;
initState()内で、tabControllerを作成する。
initState()は、オブジェクトが開始される時に呼び出されます。ここで以下のように記述してTabcontrollerを表示させます。
@override
void initState() {
super.initState();
_tabController = TabController(length: tabs.length, vsync: this);
}
AnimationController, TickerProviderを使用する場合は、vsyncが必要です。
このページにその理由がかなり丁寧に書かれています。参考にしてみてください。
Scaffold()内のbottomNavigationBarでTabBarを宣言する
実際にTabBarを宣言します。
tabsで先ほど宣言したTab()リストのtabsを、controllerも宣言したものを表記します。
残りはデザインの話です。
bottomNavigationBar: TabBar(
tabs: tabs,
controller: _tabController,
unselectedLabelColor: Colors.grey,
indicatorColor: Colors.purple,
indicatorWeight: 3,
indicatorPadding: EdgeInsets.symmetric(horizontal: 18.0,
vertical: 8),
labelColor: Colors.black,
),
Scaffold()内bodyでは、TabBarViewを宣言する
TabBarView()の中に表示するウィジェットのリストを組み込むことで、Tabに合わせてページを遷移することができます。クラスを宣言したければ、Text()の部分を該当するClass()に置き換えればOKです。
body: TabBarView(
controller: _tabController,
children:[
Text("Home"),
Text("History"),
Text("World")
]
)
まとめ・関連記事
下部にTabBarを表示する方法について説明しました。
Flutterに関する記事まとめはこちらをご覧ください。
![](https://www.mechengjp.com/wp-content/uploads/2022/02/77dc6c5012bcc2906b87c85a17a4c9c4-300x169.jpg)
他にもこんなTabBarのデザインもあります。
![](https://www.mechengjp.com/wp-content/uploads/2022/01/c22ab1316d720f2d8995591874070558-300x169.jpg)
参考記事
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JTVCRmx1dHRlciU1RCUyMFRhYkJhciVFMyU4MSVBOFRhYkJhclZpZXclRTMlODIlOTIlRTUlOEIlODklRTUlQkMlQjclRTMlODElOTclRTMlODIlODglRTMlODElODYlRTMlODAlODImdHh0LWFsaWduPWxlZnQlMkN0b3AmdHh0LWNvbG9yPSUyMzFFMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZzPTE1YjgwY2MyZmIwYzJlZTdkYzA0YzcwZDg0OTU4Y2U2&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBEcmVhbXdhbGtlciZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NjcyOTI2Mjc3NTliZjQ1MjgwMzM2NWM4MDg1Y2Q5Yjg&blend-x=142&blend-y=486&blend-mode=normal&s=108645c4b982edfa3240143e3f875b7b)
コメント