dart 如何使手势在抖动中通过PopupRoute?

smdncfj3  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(126)

我正在推送一条延伸PopupRoute的路径(扩展了ModalRoute)。此路径的内容小部件没有覆盖整个屏幕。但它吸收了所有手势,即使是那些没有被其内容覆盖的手势,因为它的屏障由父ModalRoute调整。是否有简单的方法来传递发生在“空白区域”上的手势从这条路线到它下面(后面)的路线??

7jmck4yq

7jmck4yq1#

正如我在这里的问题中所做的那样,我必须修改flutter的源代码,以便为弹出屏障添加半透明行为。
你可以把routes.dart复制到一个新的custom_routes.dart文件中,然后在这个文件中修改ModalRoute类的_buildModalBarrier函数,如下所示(见注解掉的代码):

Widget _buildModalBarrier(BuildContext context) {
    ...
    else {
      ///////////////////////////////// comment this code
      // barrier = ModalBarrier(
      //   dismissible: barrierDismissible, // changedInternalState is called if barrierDismissible updates
      //   semanticsLabel: barrierLabel, // changedInternalState is called if barrierLabel updates
      //   barrierSemanticsDismissible: semanticsDismissible,
      // );
      //////////////////////////////// add this code
      barrier = Listener(
        behavior: HitTestBehavior.translucent,
        onPointerUp: (event){
            print('event is $event');
            Navigator.of(context).pop();
        },
      );
      ////////////////////////////////
    }
    ...
  }

但是为什么不创建一个扩展ModalRoute的自定义路由呢?

你可以做到这一点,但你需要重新实现所有的逻辑,而ModalRoute会照顾你。所以经过几个小时的挖掘,不幸的是,这是唯一的方法,我发现这样做。如果有人有一个更好的方法,告诉我更新答案。

rt4zxlrg

rt4zxlrg2#

ModalRoute在构造函数下的文档中被描述为“一个阻止与先前路由交互的路由”,如果你不需要ModalRoute提供的所有魔力,你可以扩展TransitionRoute

class TapThroughOverlayRoute<T> extends TransitionRoute<T> {
  final Duration _transitionDuration;
  final WidgetBuilder builder;

  TapThroughOverlayRoute({
    required this.builder,
    Duration transitionDuration = Duration.zero,
    super.settings,
  }) : _transitionDuration = transitionDuration;

  @override
  Iterable<OverlayEntry> createOverlayEntries() {
    return [OverlayEntry(builder: builder, maintainState: true)];
  }

  @override
  bool get opaque => false;

  @override
  Duration get transitionDuration => _transitionDuration;
}

这将创建一个没有任何图层阻止与先前路线交互的路线。

相关问题