Flutter页面路由过渡动画插件route_transitions的使用
Flutter页面路由过渡动画插件route_transitions的使用
Route transitions
Route transitions
插件支持最新的Dart空安全特性。该包已被重写,以使用友好的路由函数进行导航,即使您最喜欢路由转换,也可以使用 transitionBuilder
构建自定义动画!
如何使用
要使用此插件,首先需要导入 route_transitions
包:
import 'package:route_transitions/route_transitions.dart';
然后可以像下面这样使用预定义的路由转换方法来实现页面跳转,并带有动画效果:
ElevatedButton(
onPressed: () => pushWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Push page"),
),
以上代码实现了点击按钮后,从当前页面跳转到 Dashboard
页面,并且默认带有从下到上的滑动动画。
友好的API
该插件提供了非常友好的API,可以通过以下链接查看更详细的例子:example/lib/main.dart
自定义动画与customAnimationWidget
如果您想要创建自定义动画,可以使用 customAnimationWidget
方法。例如,下面是一个缩放动画的例子:
customAnimationWidget(
newPage: YourPage(),
context: context,
transitionBuilder: (context, animation, secondaryAnimation, child) {
var begin = 0.0;
var end = 1.0;
var curve = Curves.easeIn;
var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return ScaleTransition(
scale: animation.drive(tween),
child: child,
);
},
)
这段代码将为您的页面添加一个渐进式的缩放动画效果。
完整的示例Demo
接下来提供一个完整的示例demo,它展示了如何在Flutter应用中集成和使用route_transitions
插件的不同类型的路由过渡动画。
import 'package:flutter/material.dart';
import 'package:route_transitions/route_transitions.dart';
void main() => runApp(MyApp());
const TextStyle style = TextStyle(fontSize: 22, color: Colors.white);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Route transitions',
theme: ThemeData.dark(),
home: Home(),
debugShowCheckedModeBanner: false,
);
}
}
class Home extends StatelessWidget {
const Home({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Route transitions"),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => pushWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Push page"),
),
ElevatedButton(
onPressed: () => fadeWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Fade in"),
),
ElevatedButton(
onPressed: () => slideRightWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Slide from right"),
),
ElevatedButton(
onPressed: () => slideLeftWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Slide from left"),
),
ElevatedButton(
onPressed: () => slideUpWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Slide from up"),
),
ElevatedButton(
onPressed: () => slideDownWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Slide from down"),
),
ElevatedButton(
onPressed: () => scaleWidget(
newPage: Dashboard(),
context: context,
),
child: Text("Scale page"),
),
ElevatedButton(
onPressed: () => customAnimationWidget(
newPage: Dashboard(),
context: context,
transitionBuilder: (context, animation, secondaryAnimation, child) {
var begin = 0.0;
var end = 1.0;
var curve = Curves.easeIn;
var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return ScaleTransition(
scale: animation.drive(tween),
child: child,
);
},
),
child: Text("Custom animation"),
),
],
),
),
);
}
}
class Dashboard extends StatelessWidget {
const Dashboard({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Dashboard"),
centerTitle: true,
),
body: Center(
child: ElevatedButton(
onPressed: () => pop(context),
child: Text("Go back !"),
),
),
);
}
}
这个完整的demo包含了多种不同的页面切换动画效果,您可以直接复制并在自己的项目中运行,体验各种动画效果。
更多关于Flutter页面路由过渡动画插件route_transitions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter页面路由过渡动画插件route_transitions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用route_transitions
插件来实现页面路由过渡动画的示例代码。
首先,确保你的pubspec.yaml
文件中已经添加了route_transitions
依赖:
dependencies:
flutter:
sdk: flutter
route_transitions: ^2.0.0 # 请使用最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以按照以下步骤设置路由和过渡动画。
1. 定义路由配置
在你的主文件中(通常是main.dart
),配置路由并使用RouteTransitionsBuilder
来包裹你的MaterialApp或CupertinoApp。
import 'package:flutter/material.dart';
import 'package:route_transitions/route_transitions.dart';
import 'package:flutter/cupertino.dart'; // 如果你使用Cupertino风格
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RouteTransitionsBuilder<dynamic>(
routes: {
'/': (context) => HomeScreen(),
'/second': (context) => SecondScreen(),
},
builder: (context, animation, secondaryAnimation, child) {
return MaterialApp(
title: 'Route Transitions Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: child,
);
},
);
}
}
2. 创建屏幕页面
创建两个简单的屏幕页面,HomeScreen
和SecondScreen
。
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/second', arguments: 'Hello from Home!');
},
child: Text('Go to Second Screen'),
),
),
);
}
}
class SecondScreen extends StatelessWidget {
final String message;
SecondScreen({Key? key, required this.message}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Screen'),
),
body: Center(
child: Text('Message: $message'),
),
);
}
}
3. 配置过渡动画
在RouteTransitionsBuilder
中,你可以通过transitionsBuilder
属性来定义不同的过渡动画。以下是一个简单的例子,使用默认的slideInTransition
和slideOutTransition
:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RouteTransitionsBuilder<dynamic>(
routes: {
'/': (context) => HomeScreen(),
'/second': (context) => SecondScreen(message: ModalRoute.of(context)!.settings.arguments as String),
},
transitionsBuilder: (context, animation, secondaryAnimation, child, route) {
// 使用内置的 slideInTransition 和 slideOutTransition
if (route.isInitialRoute) {
return FadeTransition(
opacity: animation,
child: child,
); // 首页可以使用不同的过渡动画,比如淡入
} else {
return SlideTransition(
position: Tween<Offset>(
begin: Offset.zero,
end: const Offset(1.0, 0),
).animate(animation),
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(-1.0, 0),
end: Offset.zero,
).animate(secondaryAnimation),
child: child,
),
); // 其他页面使用滑动过渡动画
}
},
builder: (context, animation, secondaryAnimation, child) {
return MaterialApp(
title: 'Route Transitions Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: child,
);
},
);
}
}
在上面的代码中,首页使用了淡入动画,而其他页面则使用了从右到左的滑动动画。你可以根据需要调整动画效果,route_transitions
插件提供了多种内置动画,你也可以自定义动画效果。
希望这个示例代码能帮助你在Flutter项目中实现页面路由过渡动画。