簡體   English   中英

Flutter:在 iOS 和 Android 中禁用滑動以返回導航

[英]Flutter: Disable Swipe to Navigate Back in iOS and Android

我是 Flutter 開發的新手,當你有一個導航抽屜並且當你滑動打開它時,它會在 iOS 中發現它有點令人沮喪,它會執行Navigation.of(context).pop() 我想在 iOS 中禁用這種“滑動彈出”行為。 我一直在仔細閱讀文檔,但運氣不佳。

我確實看到了一些被稱為WillPopScope東西,它似乎可以解決問題(此處為 github 問題),但我不能 100% 確定這是否是“正確”的方法(似乎太復雜了...它應該更容易......就像根應用程序上的設置一樣)。

WillPopScope執行此操作的正確方法。

(這似乎太復雜了......它應該更容易......就像根應用程序上的設置一樣)。

這並不復雜。 這是一個單班輪:

WillPopScope(
  onWillPop: () async => false,
  child: <children here>
)

配置文件會使事情變得更加復雜,因為它更難閱讀和維護。

請記住,在 flutter 中,一切都是小部件,而不僅僅是其中的一半。 認證,配置,應有盡有。

我還有一點要補充。 我只是在解決這個問題,但我也需要我的用戶能夠通過按下 AppBar 上的“原生”后退按鈕返回(不想因為這個而重新實現 AppBar),我發現了這個利基小標志:在 Navigator 對象上的userGestureInProgress ,所以我使用的(並且假定是首選方式)是:

onWillPop: () async {
    if (Navigator.of(context).userGestureInProgress)
      return false;
    else
      return true;
  },

MaterialPageRoute有一個名為fullscreenDialog的參數,默認設置為 false。 當 true 時,您的頁面動畫會有所不同,並且在 iOS 上滑動返回將被禁用。

用法示例:

 Navigator.of(context).push(
        MaterialPageRoute(builder: (_) => HomePage(), fullscreenDialog: true));

請參閱此處的一些討論: https : //github.com/flutter/flutter/issues/14203

您可以在您的 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>,
    );
  }

好吧,正如@Darky 所說WillPopScope是一個完全可以接受的答案,但是,如果您想全面禁用它,您實際上可以執行以下操作。

在 xcode 中打開您的項目,找到AppDelegate.swift並添加以下內容:

let controller: FlutterViewController
    = window?.rootViewController as! FlutterViewController;
controller.navigationController?
    .interactivePopGestureRecognizer?.isEnabled = false;

我有一個類似的問題,我想阻止滑動以返回導航(默認彈出功能)。 此代碼有助於解決問題。

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

此代碼現在阻止了 iOS 和 Android(默認后退按鈕)的后退導航,這正是我正在尋找的。 希望這會有所幫助。

我不太確定你想要實現什么,但大多數時候人們想要擺脫后台功能,因為他們不想讓用戶控制身份驗證機制。 例如,在用戶登錄后,您不希望他們通過按后退按鈕(或在 iOS 中向后滑動)導航到登錄頁面。 一個潛在的解決方案是使用pushNamedAndRemoveUntil

Future<T> pushNamedAndRemoveUntil<T extends Object>(BuildContext context, String newRouteName, RoutePredicate predicate)

將具有給定名稱的路由推送到最緊密包圍給定上下文的導航器上,然后刪除所有先前的路由,直到predicate返回 true。

示例代碼: pushNamedAndRemoveUntil(context, '/home', ModalRoute.withName('/home'));

注意:一定程度上使用此方法,因為您可能會弄亂您的導航歷史記錄。

每當按下后退按鈕滑動手勢(iOS)時,您都會在onWillPop處收到一個回調,它返回一個Future 如果Future返回 true,則彈出屏幕(即導航到前一個屏幕),如果它為 false,則不會導航回來。

Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () {
        return Future.value(false);
      },
      child: Scaffold(
        appBar: AppBar(title: Text("Second Screen"),),
        body: Center(

如果你想根據條件彈出屏幕然后聲明

bool shouldPop = true; // change this using setState() inside build on the requirement. 

  onWillPop: () {
        return Future.value(shouldPop? true: false);
      },

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM