Flutter 创建自定义路由过渡动画
TL;DR
- 使用
PageRouteBuilder创建自定义路由 - 在
transitionsBuilder方法里创建过渡动画 - 过渡动画示例
- 定义全局路由过渡动画
- 封装自定义路由
前言
在 Flutter 中使用 Navigator.of(context).push(Route route); 方法进行路由跳转时就需要传一个 Route 对象,通常使用 MaterialPageRoute(builder: () {}); 创建,使用时会在路由跳转过程中添加默认的过渡动画。当需要自定义路由过渡动画时,就要使用 PageRouteBuilder,它是 Flutter 提供的用来创建自定义的路由的一个类,实例化这个类会得到一个路由对象 Route,要做的就是创建一个自定义的 Route。
PageRouteBuilder
使用 PageRouteBuilder 创建自定义路由过渡动画时需要传入两个回调函数作为参数,一个必要参数 pageBuilder,这个函数用来创建跳转的页面,另一个函数 transitionsBuilder,这个函数就是实现过渡动画的地方。
transitionsBuilder的child参数是pageBuilder函数返回的一个transitionsBuilder widget部件,pageBuilder方法仅会在第一次构建路由的时候被调用,Flutter能够自动避免做额外的工作,整个过渡期间child保存了同一个实例。
1 | PageRouteBuilder( |
创建自定义路由需要继承 PageRouteBuilder,然后实现自定义路由的构造函数。
1 | // 定义 |
示例
使用 FirstPage 和 SecondPage 两个页面展示效果
1 | import 'package:flutter/material.dart'; |
FadeTransition
1 | class FadeRoute extends PageRouteBuilder { |
ScaleTransition
1 | class ScaleRoute extends PageRouteBuilder { |
RotationTransition
1 | class RotationRoute extends PageRouteBuilder { |
ScaleRotationRoute
结合两个过渡动画
1 | class ScaleRotationRoute extends PageRouteBuilder { |
TransformRoute
使用 Transform 部件创造 3D 效果
1 | import 'dart:math' show pi; |
EnterExitRoute
同时为进入页面和退出页面添加动画
1 | class EnterExitRoute extends PageRouteBuilder { |
使用 Navigator.pushNamed 方法跳转
在 onGenerateRoute 对跳转路由的 name 进行判断,对特定的路由添加过渡动画。
1 | class MyApp extends StatelessWidget { |
设置全局的路由过渡动画
Flutter 的默认路由过渡动画是由 buildTransitions 方法创建的,它使用的是 Theme.of(context).pageTransitionsTheme方法,因此可以定义全局的路由跳转过渡动画。
1 |
|
首先自定义一个 TransitionBuilder, buildTransitions 方法返回跳转页面。然后配置 theme 的 pageTransitionsTheme,设置对应的平台,最后在使用 MaterialPageRoute 或者 CupertinoPageRoute 进行页面跳转时就会有自定义的过渡动画了。
1 | class ScaleTransitionBuilder extends PageTransitionsBuilder { |
将动画封装成一个库
将自定义的路由过渡动画封装起来方便使用。
1 | enum TransitionType { |
参考文章
Everything you need to know about Flutter page route transition