【问题标题】:Swipe to go back gesture flutter滑动返回手势颤动
【发布时间】:2018-04-17 21:54:31
【问题描述】:

如何实现从左侧滑动以返回手势?不确定它是否已经为 iOS 自动实现,但我也希望它适用于 Android(因为事情正在变得基于手势)。

【问题讨论】:

标签: dart flutter back swipe-gesture


【解决方案1】:

使用CupertinoPageRoute 使其在Android 上运行;

import 'package:flutter/cupertino.dart';

(如How to implement swipe to previous page in Flutter? 上的回答)

【讨论】:

    【解决方案2】:

    您可以将 Theme.platform 设置为 TargetPlatform.ios。这将利用在每台设备上都使用向后滑动手势。

    【讨论】:

      【解决方案3】:

      您可以将您的theme(和darkTheme)的platform 设置为TargetPlatform.iOS,您可以将您的主题的pageTransitionsTheme 设置为,

      pageTransitionsTheme: PageTransitionsTheme(
          builders: {
            TargetPlatform.android: CupertinoPageTransitionsBuilder(),
            TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
          },
      ),
      

      您可以使用CupertinoPageRoute 加载新页面...在您确保使用Navigator.push(而不是Navigator.pushReplacement)进入新屏幕之前,这些都不起作用!我希望这可以帮助那些正在处理现有转换并且没有注意到这个关键细节的人。 :)

      【讨论】:

        【解决方案4】:

        您可以将CupertinoPageRoute() 用作Tom O'Sullivan said above。

        但是,如果您想使用PageRouteBuilders 自定义它(例如使用自定义过渡持续时间)并获得相同的滑动返回手势,那么您可以覆盖buildTransitions()。

        对于 iOS,默认的 PageTransitionBuilder 是 CupertinoPageTransitionsBuilder()。所以我们可以在buildTransitions() 中使用它。这会自动为我们提供向右滑动返回的手势。

        这是CustomPageRouteBuilder 的一些示例代码:

        class CustomPageRouteBuilder<T> extends PageRoute<T> {
          final RoutePageBuilder pageBuilder;
          final PageTransitionsBuilder matchingBuilder = const CupertinoPageTransitionsBuilder(); // Default iOS/macOS (to get the swipe right to go back gesture)
          // final PageTransitionsBuilder matchingBuilder = const FadeUpwardsPageTransitionsBuilder(); // Default Android/Linux/Windows
        
          CustomPageRouteBuilder({this.pageBuilder});
        
          @override
          Color get barrierColor => null;
        
          @override
          String get barrierLabel => null;
        
          @override
          Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
            return pageBuilder(context, animation, secondaryAnimation);
          }
        
          @override
          bool get maintainState => true;
        
          @override
          Duration get transitionDuration => Duration(milliseconds: 900); // Can give custom Duration, unlike in MaterialPageRoute
        
          @override
          Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
            return matchingBuilder.buildTransitions<T>(this, context, animation, secondaryAnimation, child);
          }
        }
        

        然后去一个新的页面:

        GestureDetector(
          onTap: () => Navigator.push(
            context,
            CustomPageRouteBuilder(pageBuilder: (context, animation, secondaryAnimation) => NewScreen()),
          ),
          child: ...,
        )
        

        【讨论】:

        • transitionDuration: transitionDuration 和 reverseTransitionDuration: transitionDuration, 参数怎么样?你可以编辑这些参数的答案吗?
        • @override // TODO: 实现 reverseTransitionDuration Duration get reverseTransitionDuration => const Duration(milliseconds: 900); //
        【解决方案5】:

        这不应该在 Android 上实现,因为它会使整个操作系统的交互不一致。

        从屏幕边缘滑动返回不是 Android 想要你实现的,所以你最好不要这样做。

        【讨论】:

        • 虽然我从用户体验的角度同意你的观点,但这并不是对实际问题的真正答案,这是一个合法的问题。
        • @Capricorn 是的,只是想看看它的实施和感觉如何,但要明白这违反了 MD 规则。
        • Android Q 推荐的方式是后退手势android-developers.googleblog.com/2019/08/…
        猜你喜欢
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多