やりたいこと
Flutterを使ったアプリの画面遷移時にアニメーションをさせたい。
Navigatorのラッパーはgo_routerを使う。
解決策
builder
ではなく、pageBuilder
を使ってGoRoute
を作る。
まずはbuilder
を使った普通の画面遷移がこれ。
至って普通。
GoRoute(
path: '/a',
builder: (context, state) => const AScreen(),
),
これを、builder
ではなくpageBuilder
に変えていく。
builder
のブロックの返り値の型はWidget
なのに対して、pageBuilder
はCustomTransitionPage
なので、まずは同一ファイルに下記のようなCustomTransitionPageを返すような関数を作る。
ちなみにこれはスライドイン×フェードインするようなアニメーション。
CustomTransitionPage<void> _buildPageWithAnimation(Widget page) {
return CustomTransitionPage<void>(
child: page,
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: SlideTransition(
position: animation.drive(
Tween<Offset>(
begin: const Offset(1, 0),
end: Offset.zero,
).chain(
CurveTween(curve: Curves.easeIn),
),
),
child: child,
),
);
},
);
}
あとは_buildPageWithAnimation()
に遷移したい画面のインスタンスを渡してpageBuilder
で返してあげれば完成。
GoRoute(
path: '/a',
pageBuilder: (context, state) => _buildPageWithAnimation(
const AScreen(),
),
),
こうするだけで、あとは普通にgo
なりpush
なりすれば画面遷移時にアニメーションしてくれる。
ちなみに、デバッグビルドだと若干カクつくので、確認する際はリリースビルドでやった方がいい。
まとめ
- go_routerを使って画面遷移時にアニメーションさせたい場合は、
builder
をpageBuilder
に変えて実装しよう。