Flutter页面协调路由插件coordinated_page_route的使用
Flutter页面协调路由插件coordinated_page_route的使用
coordinated_page_route
是一个用于 Flutter 的 Dart 包,它允许在页面过渡时同时动画化前一个路由和新进入的路由。
特性
- 允许完全自定义的动画效果,使得前一个页面和新页面之间的过渡能够同步。
- 该包还包含一些示例,以覆盖一些常见的使用场景。
SlidingPushRoute
抽象类,表示新进入的页面会通过滑动方式将之前的页面推出。子类必须指定初始偏移量,这决定了进入页面的初始位置。退出页面会动画到与该偏移量相反的位置。这种效果在至少有一个方向(dx 或 dy)的绝对值为 1 时表现得特别好,以确保页面始终接触。
该包内置了四个实现,分别针对四个主要方向:
ForwardPushRoute
BackwardPushRoute
UpwardPushRoute
DownwardPushRoute
SlidingFadePushRoute
几乎与 SlidingPushRoute
相同,但增加了进入页面的淡入效果和退出页面的淡出效果。
同样有四个实现,分别对应四个方向:
ForwardFadePushRoute
BackwardFadePushRoute
UpwardFadePushRoute
DownwardFadePushRoute
CoordinatedZoomFadeRoute
一种更视觉上有趣的全自定义过渡效果。退出页面逐渐扩大并淡出,而进入页面则从小尺寸开始扩大并淡入。由于这种过渡是透明的,应该使用透明页面,并且导航器应放置在不透明背景上。
开始使用
请参阅 示例。
使用方法
要在任何希望使用协调动画的 Navigator
中使用 CoordinatedPageRoute
,你必须在 NavigatorObserver
列表中包含一个 CoordinatedRouteObserver
。
对于 MaterialApp
,代码如下:
MaterialApp(
navigatorObservers:
[
CoordinatedRouteObserver() // 这里必须添加!
]
)
对于独立的 Navigator
,代码如下:
Navigator(
observers:
[
CoordinatedRouteObserver() // 这里必须添加!
]
)
然后像往常一样推送你的路由:
Navigator.of(context).push(ForwardPushRoute((context) => MyPage())),
要创建自己的动画过渡,只需扩展 CoordinatedPageRoute
基类并实现以下方法:
- getEntryTransition:一个函数,接收
BuildContext
、Animation
和子Widget
,返回变换后的Widget
。这直接传递给PageRouteBuilder
的transitionsBuilder
,你应该对此比较熟悉。 - getExitTransition:类似于
entryTransitionBuilder
,但在实践中,BuildContext
将是Navigator
的BuildContext
,而子Widget
将从上一个路由捕获(或更具体地说,从包含上一个路由构建的页面的叠加层条目的Widget
)。
因为两个构建器都访问了从进入路由的 PageRouteBuilder
传递下来的相同 animation
,所以动画是同步的。
额外信息
更多详细信息,请参阅 pub.dev
示例代码
import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'package:example/src/on_generate_route.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(home: MaterialAppExample());
}
}
class MaterialAppExample extends StatelessWidget {
const MaterialAppExample({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
color: Colors.black,
child: MaterialApp(
navigatorObservers: [
CoordinatedRouteObserver() // 这里必须添加!
],
initialRoute: 'home',
onGenerateRoute: onGenerateRoute,
),
);
}
}
class NavigatorExample extends StatelessWidget {
const NavigatorExample({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Navigator(
observers: [
CoordinatedRouteObserver() // 这里必须添加!
],
initialRoute: 'home',
onGenerateRoute: onGenerateRoute,
));
}
}
更多关于Flutter页面协调路由插件coordinated_page_route的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter页面协调路由插件coordinated_page_route的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用coordinated_page_route
插件的一个基本示例。coordinated_page_route
插件允许你在Flutter应用中协调页面路由和状态管理,使得页面之间的数据传递和状态同步更加便捷。
首先,你需要在你的pubspec.yaml
文件中添加该插件的依赖:
dependencies:
flutter:
sdk: flutter
coordinated_page_route: ^最新版本号 # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们将展示如何使用coordinated_page_route
进行页面路由和状态协调。
1. 创建一个简单的Flutter应用
假设我们有一个简单的Flutter应用,其中有两个页面:HomePage
和DetailPage
。
主文件:main.dart
import 'package:flutter/material.dart';
import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'home_page.dart';
import 'detail_page.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: CoordinatorLayout(
// 定义协调器,用于管理状态
coordinator: Coordinator(),
child: HomePage(),
),
routes: {
'/detail': (context) => CoordinatorLayout(
coordinator: context.coordinator, // 使用相同的coordinator实例
child: DetailPage(),
),
},
);
}
}
主页:home_page.dart
import 'package:flutter/material.dart';
import 'package:coordinated_page_route/coordinated_page_route.dart';
import 'detail_page.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final coordinator = context.coordinator;
return Scaffold(
appBar: AppBar(
title: Text('Home Page'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 传递数据到DetailPage
coordinator.navigate(
context,
'/detail',
arguments: {'data': 'Hello from Home Page!'},
);
},
child: Text('Go to Detail Page'),
),
),
);
}
}
详情页:detail_page.dart
import 'package:flutter/material.dart';
import 'package:coordinated_page_route/coordinated_page_route.dart';
class DetailPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final coordinator = context.coordinator;
final routeArguments = coordinator.routeArguments<Map<String, String>>(context);
return Scaffold(
appBar: AppBar(
title: Text('Detail Page'),
),
body: Center(
child: Text(routeArguments?['data'] ?? 'No data provided'),
),
);
}
}
2. 运行应用
现在,当你运行这个Flutter应用时,你应该能够看到HomePage
,点击按钮后会导航到DetailPage
,并显示从HomePage
传递过来的数据。
关键点总结
- 使用
CoordinatorLayout
和coordinator
来管理路由和状态协调。 - 使用
coordinator.navigate
进行页面导航,并传递数据。 - 使用
coordinator.routeArguments
在目标页面中获取传递的数据。
这个示例展示了如何使用coordinated_page_route
插件进行基本的页面协调和状态管理。根据你的具体需求,你可以进一步扩展和自定义这些功能。