Flutter- PopupRoute用法

938 阅读1分钟

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));
```
```