颤动:禁用滑动以在iOS中导航回来

Jam*_*ist 5 ios flutter

我是新手来讨论开发,并且当你有一个导航抽屉时,在iOS中发现它有点令人沮丧,当你滑动打开它时,它会执行一个Navigation.of(context).pop().我想在iOS中禁用这种"轻扫到弹出"行为.我一直在阅读文档,但没有太多运气.

我确实看到了一些被称为WillPopScope诀窍的东西(这里有github问题),但我不能100%确定这是否是"正确"的方法(看起来太复杂了......)应该更容易......就像根应用程序上的设置一样).

小智 21

我还有一点要补充。我只是在解决这个问题,但我也需要我的用户能够通过按下 AppBar 上的“原生”后退按钮返回(不想因为这个而重新实现 AppBar),我发现了这个利基小标志:userGestureInProgress在 Navigator 对象上,所以我使用的(并且假定是首选方式)是:

onWillPop: () async {
    if (Navigator.of(context).userGestureInProgress)
      return false;
    else
      return true;
  },
Run Code Online (Sandbox Code Playgroud)

  • 你甚至可以这样简化:`onWillPop: () async => !Navigator.of(context).userGestureInProgress` (4认同)

Rém*_*let 16

WillPopScope 这样做的正确方法.

不要责怪Flutter.责备IOS没有后退按钮[插入邪恶的笑容].

(它看起来太复杂......它应该更容易......就像根应用程序上的设置一样).

这绝对不复杂.这是一个班轮:

new WillPopScope(
    onWillPop: () async {
      return false;
    },
    child: <children here>
)
Run Code Online (Sandbox Code Playgroud)

配置文件会使事情变得更加复杂,因为它更难以阅读和维护.

请记住,在颤动中,一切都是小部件而不仅仅是其中的一半.认证,配置,一切.


Mis*_*son 14

MaterialPageRoute有一个名为的参数fullscreenDialog,默认设置为 false。当为 true 时,您的页面动画会有所不同,并且在 iOS 上滑动返回将被禁用。

用法示例:

 Navigator.of(context).push(
        MaterialPageRoute(builder: (_) => HomePage(), fullscreenDialog: true));
Run Code Online (Sandbox Code Playgroud)

请参阅此处的一些讨论:https : //github.com/flutter/flutter/issues/14203

  • 这对我来说非常适合条款和条件页面。谢谢。 (2认同)

小智 6

我遇到了类似的问题,我想阻止滑动返回导航(默认弹出功能)。这段代码帮助解决了这个问题。

@override
Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async => false,
      child: Scaffold(
        body: Center(
          child: Text('Example'),
        ),
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

此代码现在会阻止 iOS 和 Android 的后退导航(默认后退按钮),而这正是我所寻找的。希望这可以帮助。


Wat*_*low 5

您可以在您的 Widget 版本中尝试此操作:

@override
  Widget build(BuildContext context) {
    return WillPopScope(//forbidden swipe in iOS(my ThemeData(platform: TargetPlatform.iOS,)
      onWillPop: ()async {
        if (Navigator.of(context).userGestureInProgress)
          return false;
        else
          return true;
      },
      child: <your child>,
    );
  }
Run Code Online (Sandbox Code Playgroud)


小智 5

新 Flutter 版本更新:WillPopScope 现在变为 PopScope,具有更简单的 canPop 属性

PopScope(
  canPop : false,
  child : --child here--
)
Run Code Online (Sandbox Code Playgroud)

这段代码应该可以解决问题