[Flutter]BottomNavigationBarの画面遷移にアニメーションをつけるには?

その他

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

BottomNavigationBarの画面遷移にアニメーションをつける方法を紹介します。

スポンサーリンク

方法

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

BottomNavigationBarの画面遷移にアニメーションをつけるには、PageViewを使います。

まず、Controllerの変数の用意と初期化、破棄を指定します。

  PageController? _controller;
  
  @override
  void initState() {
    super.initState();
    _controller = PageController(); //初期化
  }

  @override
  void dispose() {
    _controller?.dispose();//破棄
    super.dispose();
  }

次に、PageViewの引数「controller」に用意した変数、引数「children」に遷移するページを指定します。

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        controller: _controller,
        children: [
          Page1(),
          Page2(),
          page3(),
          ・・・
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          ・・・
        ],
        currentIndex: _currentIndex,
        onTap: _onTap,
      ),
    );
  }

最後に、BottomNavigationBarのタップ処理に変更を加えます。

タップ処理ではBottomNavigationBarのインデックスの更新をした後に、PageControllerのanimateToメソッドを呼び出します。

このanimateToメソッドでは、画面遷移先の指定とアニメーションの設定を行います。

  void _onTap(int index) {

    setState(() {
      _currentIndex = index;//インデックスの更新
    });

    _controller?.animateToPage(
      index,//PageViewの画面遷移先
      duration: Duration(/*アニメーションの時間*/),
      curve: /*アニメーションの仕方をCurvesで指定*/,
    );

  }

あとは、BottomNavigationBarの引数「onTap」に用意したタップ処理を指定します。

これでBottomNavigationBarの画面遷移にアニメーションをつけることが出来ます。

使用例

以下は、使用例です。

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var _currentIndex = 0;
  PageController? _controller;

  @override
  void initState() {
    super.initState();
    _controller = PageController();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(
        controller: _controller,
        children: [
          Container(
            child: Text('Settings'),
            alignment: Alignment.center,
            color: Colors.green,
          ),
          Container(
            child: Text('Home'),
            alignment: Alignment.center,
            color: Colors.blue,
          ),
          Container(
            child: Text('Favorite'),
            alignment: Alignment.center,
            color: Colors.pink.withOpacity(0.3),
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.settings),
            label: 'Settings',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.favorite),
            label: 'Favorite',
          ),
        ],
        currentIndex: _currentIndex,
        onTap: _onTap,
      ),
    );
  }

  void _onTap(int index) {
    setState(() {
      _currentIndex = index;
    });

    _controller?.animateToPage(
      _currentIndex,
      duration: Duration(seconds: 2),
      curve: Curves.bounceInOut,
    );
  }
  
}

まとめ

BottomNavigationBarの画面遷移にアニメーションをつけるには、PageViewを使います。

コメント

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