Files
fengshui_compass/lib/utils/navigator_utils.dart
2022-06-27 09:51:30 +08:00

164 lines
4.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
);
}
}