164 lines
4.7 KiB
Dart
164 lines
4.7 KiB
Dart
|
import 'dart:io';
|
|||
|
|
|||
|
import 'package:flutter/cupertino.dart';
|
|||
|
import 'package:flutter/material.dart';
|
|||
|
|
|||
|
/// 创建人: Created by zhaolong
|
|||
|
/// 创建时间:Created by on 2020/12/9.
|
|||
|
///
|
|||
|
/// 可关注公众号:我的大前端生涯 获取最新技术分享
|
|||
|
/// 可关注网易云课堂:https://study.163.com/instructor/1021406098.htm
|
|||
|
/// 可关注博客:https://blog.csdn.net/zl18603543572
|
|||
|
///
|
|||
|
|
|||
|
class NavigatorUtils {
|
|||
|
///普通打开页面的方法
|
|||
|
///[context] 上下文对象
|
|||
|
///[targPage] 目标页面
|
|||
|
///[isReplace] 是否替换当前页面 A -B
|
|||
|
static void pushPage({
|
|||
|
BuildContext context,
|
|||
|
Widget targPage,
|
|||
|
bool isReplace = false,
|
|||
|
Function(dynamic value) dismissCallBack,
|
|||
|
}) {
|
|||
|
PageRoute pageRoute;
|
|||
|
|
|||
|
if (Platform.isAndroid) {
|
|||
|
pageRoute = MaterialPageRoute(builder: (BuildContext context) {
|
|||
|
return targPage;
|
|||
|
});
|
|||
|
} else {
|
|||
|
pageRoute = CupertinoPageRoute(builder: (BuildContext context) {
|
|||
|
return targPage;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (isReplace) {
|
|||
|
Navigator.of(context).pushReplacement(pageRoute).then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
Navigator.of(context).push(pageRoute).then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
///普通打开页面的方法
|
|||
|
///[context] 上下文对象
|
|||
|
///[targPage] 目标页面
|
|||
|
///[isReplace] 是否替换当前页面 A -B
|
|||
|
///[opaque] 是否以背景透明的方式打开页面
|
|||
|
static void pushPageByFade({
|
|||
|
BuildContext context,
|
|||
|
Widget targPage,
|
|||
|
bool isReplace = false,
|
|||
|
int startMills = 400,
|
|||
|
bool opaque = false,
|
|||
|
Function(dynamic value) dismissCallBack,
|
|||
|
}) {
|
|||
|
PageRoute pageRoute = PageRouteBuilder(
|
|||
|
//背景透明 方式打开新的页面
|
|||
|
opaque: opaque,
|
|||
|
pageBuilder: (BuildContext context, Animation<double> animation,
|
|||
|
Animation<double> secondaryAnimation) {
|
|||
|
return targPage;
|
|||
|
},
|
|||
|
transitionDuration: Duration(milliseconds: startMills),
|
|||
|
//动画
|
|||
|
transitionsBuilder: (BuildContext context, Animation<double> animation,
|
|||
|
Animation<double> secondaryAnimation, Widget child) {
|
|||
|
return FadeTransition(
|
|||
|
opacity: animation,
|
|||
|
child: child,
|
|||
|
);
|
|||
|
},
|
|||
|
);
|
|||
|
|
|||
|
if (isReplace) {
|
|||
|
Navigator.of(context).pushReplacement(pageRoute).then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
Navigator.of(context).push(pageRoute).then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
///中间缩放的形式打开页面
|
|||
|
/// 开源项目 Flutter-HO 早起的年轻人
|
|||
|
/// github https://github.com/zhaolongs/flutter-ho
|
|||
|
static void pushPageByCenterScale({
|
|||
|
BuildContext context,
|
|||
|
Widget targPage,
|
|||
|
bool isReplace = false,
|
|||
|
int startMills = 400,
|
|||
|
int reversMills = 400,
|
|||
|
bool opaque = false,
|
|||
|
Function(dynamic value) dismissCallBack,
|
|||
|
}) {
|
|||
|
if (isReplace) {
|
|||
|
Navigator.of(context)
|
|||
|
.pushReplacement(
|
|||
|
_createRoute(context, targPage, startMills, reversMills))
|
|||
|
.then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
Navigator.of(context)
|
|||
|
.push(_createRoute(context, targPage, startMills, reversMills))
|
|||
|
.then((value) {
|
|||
|
if (dismissCallBack != null) {
|
|||
|
dismissCallBack(value);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static Route _createRoute(BuildContext parentContext, Widget targPage,
|
|||
|
int startMills, int reversMills) {
|
|||
|
return PageRouteBuilder<void>(
|
|||
|
pageBuilder: (context, animation, secondaryAnimation) {
|
|||
|
return targPage;
|
|||
|
},
|
|||
|
transitionDuration: Duration(milliseconds: startMills),
|
|||
|
reverseTransitionDuration: Duration(milliseconds: reversMills),
|
|||
|
transitionsBuilder: (context, animation, secondaryAnimation, child) {
|
|||
|
var rectAnimation = _createTween(parentContext)
|
|||
|
.chain(CurveTween(curve: Curves.ease))
|
|||
|
.animate(animation);
|
|||
|
|
|||
|
return Stack(
|
|||
|
children: [
|
|||
|
PositionedTransition(rect: rectAnimation, child: child),
|
|||
|
],
|
|||
|
);
|
|||
|
},
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
static Tween<RelativeRect> _createTween(BuildContext context) {
|
|||
|
var windowSize = MediaQuery.of(context).size;
|
|||
|
var box = context.findRenderObject() as RenderBox;
|
|||
|
var rect = box.localToGlobal(Offset.zero) & box.size;
|
|||
|
var relativeRect = RelativeRect.fromSize(rect, windowSize);
|
|||
|
|
|||
|
return RelativeRectTween(
|
|||
|
begin: relativeRect,
|
|||
|
end: RelativeRect.fill,
|
|||
|
);
|
|||
|
}
|
|||
|
}
|