くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutterでページ遷移をいい感じにする(animations/標準トランジション)

go_routerに再入門してみたけど、ページ遷移のアニメーションが微妙。。

いろいろ見てみると、公式ドキュメントがよいライブラリを公開していたので、
試してみたときの備忘録。

アニメーション全般の公式ドキュメントはこのあたり。

animationsを使ってみる

install

$ fvm flutter pub add animations
$ fvm flutter pub get

SharedAxisPageTransitionsBuilderの例

READMEにサンプル動画があるけど、

以下の4つが用意されている。

  • Shared axis
  • Container transform
  • Fade through
  • Fade
// app_theme.dart
import 'package:animations/animations.dart';
import 'package:flutter/material.dart';

const _defaultPageTransition = SharedAxisPageTransitionsBuilder(
  transitionType: SharedAxisTransitionType.horizontal,
);

final appTheme = ThemeData(
  primarySwatch: Colors.blue,
  // 未指定のPlatformは、ZoomPageTransitionsBuilderになる
  pageTransitionsTheme: const PageTransitionsTheme(builders: {
    TargetPlatform.android: _defaultPageTransition,
    TargetPlatform.fuchsia: _defaultPageTransition,
    TargetPlatform.iOS: _defaultPageTransition,
    TargetPlatform.macOS: _defaultPageTransition,
    TargetPlatform.linux: _defaultPageTransition,
    TargetPlatform.windows: _defaultPageTransition,
  }),
);
// add.dart
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'app_theme.dart';

class App extends HookConsumerWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return FlavorBanner(
      child: MaterialApp.router(
        theme: appTheme,
        // ...略
      ),
    );
  }
}

詳しい使い方や設定方法などは、codelabsを参照。

標準のPageTransition

標準だと以下のPageTransitionBuilderが用意されている。

  • FadeUpwardsPageTransitionsBuilder
  • OpenUpwardsPageTransitionsBuilder
  • ZoomPageTransitionsBuilder
  • CupertinoPageTransitionsBuilder

親クラスはこれ。

実際の動きはこの記事がわかりやすい

PageTransitionsThemeのデフォルト値などは、こんな感じ。

const PageTransitionsTheme({ Map<TargetPlatform, PageTransitionsBuilder> builders = _defaultBuilders }) : _builders = builders;

// デフォルトの値(OS別で設定。webでもappでも同じ)
static const Map<TargetPlatform, PageTransitionsBuilder> _defaultBuilders = <TargetPlatform, PageTransitionsBuilder>{
  TargetPlatform.android: ZoomPageTransitionsBuilder(),
  TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
  TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
};

// buildersに存在しないものは、ZoomPageTransitionsBuilderを利用
final PageTransitionsBuilder matchingBuilder =
  builders[platform] ?? const ZoomPageTransitionsBuilder();

その他

こんなライブラリもある。
テーマで指定するより、個別の遷移で使うといいかも。

参考にしたサイトさま