路由工具
import 'package:test/main.dart';
import 'package:flutter/material.dart';import 'circle_page_route.dart';class NavigatorUtil {static push(Widget page, {BuildContext context}) {return Navigator.push(context ?? navigatorKey.currentContext,MaterialPageRoute(builder: (context) => page));}/// 透明页面static pushTransparentRoute(Widget page, {BuildContext context}) {return Navigator.push(context ?? navigatorKey.currentContext,TransparentRoute(builder: (context) => page));}/// 透明关闭页面static pushTransparentReplacement(Widget page, {BuildContext context}) {return Navigator.pushReplacement(context ?? navigatorKey.currentContext,TransparentRoute(builder: (context) => page));}/// 关闭所有页面static pushReplacement(Widget page, {BuildContext context,}) {Navigator.pushReplacement(context ?? navigatorKey.currentContext,MaterialPageRoute(builder: (context) => page));}/// 跳转并且无法返回到上一页static pushAndNoBack(Widget page, {BuildContext context}) {return Navigator.pushAndRemoveUntil(context ?? navigatorKey.currentContext,MaterialPageRoute(builder: (context) => page),(route) => route == null);}/// 返回上一页static pop<T extends Object>({BuildContext context, T value}) {Navigator.pop(context == null ? navigatorKey.currentContext : context, value);}/// 删除指定路由static removeRoute(Widget page, {BuildContext context}) {return Navigator.removeRoute(context ?? navigatorKey.currentContext,MaterialPageRoute(builder: (context) => page));}
}
路由
//透明路由
class TransparentRoute extends PageRoute<void> {TransparentRoute({ this.builder,});final WidgetBuilder builder;Duration get transitionDuration => Duration(milliseconds: 100); bool get opaque => false; bool get barrierDismissible => false;Color get barrierColor => Colors.white.withOpacity(0.1);String get barrierLabel => null; bool get maintainState => true;Widget buildPage(BuildContext context, Animation<double> animation,Animation<double> secondaryAnimation) {return Container(child: builder(context),);}
}
// 孔雀开屏动画效果路由
class CirclePageRoute extends PageRoute {CirclePageRoute({ this.builder,});final WidgetBuilder builder;Duration get transitionDuration => Duration(milliseconds: 500); bool get opaque => false; bool get barrierDismissible => false;Color get barrierColor => Colors.white.withOpacity(0.1);String get barrierLabel => null; bool get maintainState => true;Widget buildPage(BuildContext context, Animation<double> animation,Animation<double> secondaryAnimation) {return Container(child: builder(context),);}Widget buildTransitions(BuildContext context, Animation<double> animation,Animation<double> secondaryAnimation, Widget child) {return AnimatedBuilder(animation: animation,builder: (context, child) {return ClipPath(clipper: CirclePath(animation.value),child: child,);},child: builder(context),);}
}
透明遮罩页面显示
//在需要遮罩的页面的initState()函数中使用
void initState() {super.initState();WidgetsBinding.instance.addPostFrameCallback((_) {NavigatorUtil.pushTransparentRoute(PushArticleGuidePage(itemType: 1,));});}