[Flutter]TabBarのインデックスが切り替わる際に処理をするには?

Flutter

どうも、ちょげ(@chogetarou)です。

TabBarのインデックスが切り替わる際に処理をする方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

TabBarのインデックスが切り替わる際に処理をするには、TabControllerを使います。

まず、TabControllerの変数を用意します。

次に、TabControllerのaddListenerにインデックスが切り替わる際の処理を指定します。

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {

  TabController? _tabController;

  @override
  void initState() {
    super.initState();

    _tabController = TabController(vsync: this, length: /*タブの長さ*/);
    _tabController!.addListener(() {
      //インデックスが切り替わる際の処理
    });

  }

  @override
  void dispose() {
    _tabController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(・・・);
  }
}

最後に、TabBarの引数「controller」に用意したTabControllerの変数を指定します。

TabBar(
  controller: _tabController,
  tabs: [
       ・・・
  ],
),

TabControllerを使うことで、TabBarのインデックスが切り替わる際に処理をすることが出来ます。

使用例

以下は、使用例です。

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  var _currentIndex = 0;
  TabController? _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: 3);
    _tabController!.addListener(() {
      setState(() {
        _currentIndex = _tabController!.index;
      });
    });
  }

  @override
  void dispose() {
    _tabController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Center(
          child: Text('Index : $_currentIndex'),
        ),
        bottomNavigationBar: Container(
          color: Colors.blue,
          child: TabBar(
            controller: _tabController,
            tabs: [
              Tab(icon: Icon(Icons.person)),
              Tab(icon: Icon(Icons.today)),
              Tab(icon: Icon(Icons.settings)),
            ],
          ),
        ),
      ),
    );
  }
}

コメント

タイトルとURLをコピーしました