PopupRoute
-
定义:一个定义路由跳转的抽象方法,具体用法是可以弹出透明的布局的抽象Route。
-
区别:与抽象类PageRoute的区别,PageRouge会生成新的全屏widget遮挡上一个路由widget,就算设置颜色transparent,也看不到上一个页面。而PopupRoute则可以叠在当前路由上方,只要设置下一个页面widget为透明即可。
-
实际用法:全屏的透明弹窗、弹出层等,点击空白处返回等
-
使用:先自定义一个PopRoute继承抽象类PopupRoute
class PopRoute extends PopupRoute {
// push的耗时,milliseconds为毫秒
final Duration _duration = const Duration(milliseconds: 100);
// 接收一个child,也就是我们push的内容。
Widget child;
// 构造方法
PopRoute({required this.child});
@override
Color? get barrierColor => null;
@override
bool get barrierDismissible => true;
@override
String? get barrierLabel => null;
@override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return child;
}
@override
Duration get transitionDuration => _duration;
}
- 如何设置要跳转的页面透明全屏
@override
Widget build(BuildContext context) {
return Material(
type: MaterialType.transparency, // Material类型设置
child: GestureDetector(
child: Stack(
alignment: AlignmentDirectional.center,
children: <Widget>[
Container(
// 设置一个容器组件,是整屏幕的。
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
color: Colors.transparent, // 它的颜色为透明色
),
Positioned(
child:弹窗内容
top: widget.positionTop, // 顶部位置(自己设置)
)
],
),
onTap: () => Navigator.of(context).pop(), //点击空白处直接返回
onVerticalDragStart: (details) => Navigator.of(context).pop(),
onHorizontalDragStart: (details) => Navigator.of(context).pop(),
),
);
}
- 最后使用跳转
Navigator.push(
context,
PopRoute(
child: 要跳转的widget));
```
```