You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS使用Android Page Transition时如何保留Swipe back侧滑返回手势

问题根因

MaterialPageRoute的fullscreenDialog属性设为true时,Flutter框架会默认禁用iOS端的侧滑返回手势,该设计是为全屏模态页面预设的独立交互规则,和过渡动画本身无直接关联。

实现方案

下面两种方案都可以在保留Android页面过渡效果的前提下恢复侧滑返回能力:

方案1:自定义页面路由(推荐)

不使用fullscreenDialog属性,手动指定路由的过渡效果为Android样式,同时保留系统原生侧滑返回支持,侵入性最低。

  1. 先自定义路由类:
class AndroidTransitionPageRoute<T> extends MaterialPageRoute<T> {
  AndroidTransitionPageRoute({
    required super.builder,
    super.settings,
    super.fullscreenDialog = false,
  });

  // 强制覆盖为Android风格的页面过渡
  @override
  Widget buildTransitions(
    BuildContext context,
    Animation<double> animation,
    Animation<double> secondaryAnimation,
    Widget child,
  ) {
    // 此处为Android默认的底部滑入过渡,可根据需求修改为其他安卓过渡效果
    const begin = Offset(0, 1);
    const end = Offset.zero;
    final tween = Tween(begin: begin, end: end).chain(CurveTween(curve: Curves.easeInOut));
    return SlideTransition(
      position: animation.drive(tween),
      child: child,
    );
  }
}
  1. 替换原有跳转逻辑:
Navigator.push(
  context,
  AndroidTransitionPageRoute(
    builder: (context) => Chat(
      peerid: peerid,
      userid: widget.matchesId,
    ),
  ),
);

方案2:保留fullscreenDialog配置,手动添加侧滑手势

如果必须保留fullscreenDialog: true的原有配置,可以直接在目标页面(Chat页)添加手势监听实现侧滑返回:
修改Chat页的build方法:

@override
Widget build(BuildContext context) {
  return GestureDetector(
    // 监听横向滑动,阈值可根据实际需求调整
    onHorizontalDragUpdate: (details) {
      if (details.delta.dx > 15 && ModalRoute.of(context)?.isCurrent == true) {
        Navigator.pop(context);
      }
    },
    // 此处保留你原有的Chat页根布局代码
    child: Scaffold(
      // ... 原有代码
    ),
  );
}

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:18:02