表示非表示をアニメーション付きでハンドリングするWidgetの作り方

はじめに

今回のモチベーションとしては漫画のビューワーなどでフルスクリーン時にAppBarやNavigationBarの表示非表示を行いたいというものです。

実装

今回の例としてはAppBarをAnimation付きでハンドリングするためのものを紹介します。

class AnimationAppBar extends StatelessWidget implements PreferredSizeWidget {
  const AnimationAppBar({
    Key? key,
    required this.child,
    required this.controller,
    required this.visible,
    required this.beginOffset,
    required this.endOffset,
  }) : super(key: key);

  final PreferredSizeWidget child;
  final AnimationController controller;
  final bool visible;
  final Offset beginOffset;
  final Offset endOffset;

  @override
  Size get preferredSize => child.preferredSize;

  @override
  Widget build(BuildContext context) {
    visible ? controller.reverse() : controller.forward();
    return SlideTransition(
      position:
          Tween<Offset>(begin: beginOffset, end: endOffset).animate(
        CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn),
      ),
      child: child,
    );
  }
}

SlideTransition を使用します。プロパティの position にどのようにアニメーションするかを入れます。
そして、それぞれ使いやすいように child を引数に取ることによって使う側でAppBarのUIを決定することができます。
AnimationController を表示非表示のフラグに合わせて controller.reverse() , controller.forward() をします。今回のOffsetとしては begincontroller.reverse() に合わせて Offset.zero を指定し、 endOffSet(0, -1) を指定しました。

AppBar以外でも使うために

今回はAppBar用のものを紹介しましたが、他でも使うためには PreferredSizeWidget をimplementsしないようにし、 child の型を Widget に変更しましょう。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。募集にはありませんが、長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com