4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

flutter_hooksでタブ切り替えを実現する

Last updated at Posted at 2021-09-11

背景

Web上には、stateful widgetのtabの実装例はあれど、hooksのパターンが少ないので記載しました。
flutter_hooksには、デフォルトでuseTabControllerのフックを備えているのでそちらを利用しています。

実装イメージ

tab.gif

開発環境

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(),
      ),
    );
  }
}
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?