背景
Web上には、stateful widgetのtabの実装例はあれど、hooksのパターンが少ないので記載しました。
flutter_hooksには、デフォルトでuseTabControllerのフックを備えているのでそちらを利用しています。
実装イメージ
開発環境
mac Big Sur(v11.3, intel)
Android Studio 4.2.2
Xcode 12.5
Flutter 2.5.0
Dart 2.14.0
プラグイン環境
flutter_hooks: ^0.18.0
準備
プラグインをインストールするために、pubspec.yamlのdependenciesにflutter_hooksを追加
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
flutter_hooks: ^0.18.0 # ←✨追加✨
実装
以下のflutter_hooksプラグインの公式を参考にして実装しました。
https://pub.dev/documentation/flutter_hooks/latest/flutter_hooks/useTabController.html
もし、以下ソースコードを簡単に動かしたい場合は、GitHubに置いたので参考にしていただければと。
class TabBarViewWidget extends HookWidget {
TabBarViewWidget({Key? key}) : super(key: key);
/// タブ切り替え画面
final List<Widget> tabList = [
const Tab(child: Text('Tab 1')),
const Tab(child: Text('Tab 2')),
const Tab(child: Text('Tab 3')),
];
@override
Widget build(BuildContext context) {
final _controller = useTabController(initialLength: tabList.length);
return Column(
children: [
/// TabBar(=タブ画面)を表示
TabBar(
controller: _controller,
tabs: tabList,
labelColor: Theme.of(context).primaryColor,
),
Expanded(
/// タブの中身を表示するWidget
child: TabBarView(
controller: _controller,
/// タブに表示したいWidgetをchildrenに記載する
children: const [
Center(child: Text('Tab 1 View')),
Center(child: Text('Tab 2 View')),
Center(child: Text('Tab 3 View')),
],
),
)
],
);
}
}
参考のため、呼び出し元も記載しておきます。
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text('TabBar using flutter_hooks'),
),
/// ここで上記のWidgetを呼び出している
body: TabBarViewWidget(),
),
);
}
}