Flutter TabBar

本ドキュメントでは、FlutterのNavigationBarについて記述する。

TabBarとは、画面の上にあるバーのことで、各文字列をタップすると、そのアイコンに関連した画面が表示される(以下例だと、Bの文字列をタップしたら、Bと表示されている画面が表示される)

以下に実装を示す。importパッケージはflutterのみ。

import 'package:flutter/material.dart';

class KwTabView extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _KwTabView();
  }
}

class _KwTabView extends State<KwTabView> with SingleTickerProviderStateMixin {
  final bool _mIsRebuildBody = true;
  List<String> _mTabList = ['A', 'B', 'C'];
  List<Widget> _mTabBodyWidgetList = [
    _TmpBodyWidget('A'),
    _TmpBodyWidget('B'),
    _TmpBodyWidget('C'),
  ];
  TabController _mTabController;
  int _mTabIndex = 0;

  @override
  void initState() {
    _mTabController = TabController(
        initialIndex: _mTabIndex, length: _mTabList.length, vsync: this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        title: Text('Tab View'),
        bottom: TabBar(
          controller: _mTabController,
          tabs: _mTabList.map((String tabText) {
            return Tab(text: tabText);
          }).toList(),
          onTap: (int index) {
            setState(() {
              _mTabIndex = index;
            });
          },
        ),
      ),
      body: _mIsRebuildBody == true
          ? _mTabBodyWidgetList[_mTabIndex]
          : IndexedStack(
              index: _mTabIndex,
              children: _mTabBodyWidgetList,
            ),
    );
  }
}

class _TmpBodyWidget extends StatelessWidget {
  final String _mLabel;

  _TmpBodyWidget(this._mLabel);

  @override
  Widget build(BuildContext context) {
    print("_TmpBodyWidget build $_mLabel");
    return Scaffold(
      body: Center(
        child: Text(
          _mLabel,
          style: TextStyle(fontSize: 120),
        ),
      ),
    );
  }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です