Je suis nouveau dans le développement flottant, et je trouve cela un peu frustrant dans iOS lorsque vous avez un tiroir de navigation et lorsque vous faites glisser pour l'ouvrir, il effectuera une Navigation.of(context).pop()
. Je voudrais désactiver ce comportement "glisser pour faire apparaître" dans iOS. J'ai parcouru la documentation, mais sans beaucoup de chance.
Je vois quelque chose appelé WillPopScope
qui semble faire l'affaire ( problème de github ici ), mais je ne suis pas sûr à 100% si c'est la façon "correcte" de le faire (cela semble trop compliqué ... ça devrait être plus facile ... comme un réglage sur l'application racine).
J'ai un point supplémentaire ici. Je venais de résoudre ce problème, mais j'avais également besoin que mon utilisateur puisse revenir en arrière en appuyant sur le bouton de retour "natif" de l'AppBar (je ne voulais pas réimplémenter AppBar juste à cause de cela), et j'ai trouvé ce petit drapeau de niche : userGestureInProgress
sur l'objet Navigator, donc ce que j'utilise (et je suppose que c'est la manière préférée) est:
onWillPop: () async {
if (Navigator.of(context).userGestureInProgress)
return false;
else
return true;
},
WillPopScope
is la bonne façon de procéder.
Ne blâmez pas Flutter ici. Blâme IOS pour ne pas avoir de bouton de retour [insérer un sourire diabolique].
(cela semble trop compliqué ... ça devrait être plus facile ... comme un réglage sur l'application root).
Ce n'est absolument pas compliqué. C'est une doublure:
new WillPopScope(
onWillPop: () async {
return false;
},
child: <children here>
)
Un fichier de configuration compliquerait les choses car il est plus difficile à lire et à maintenir.
Et rappelez-vous que en flutter tout est un widget pas seulement la moitié d'entre eux. Authentification, configurations, tout.
D'accord, comme @Darky l'a dit WillPopScope
est une réponse parfaitement acceptable, cependant, si vous voulez le désactiver de manière générale, vous pouvez réellement faire ce qui suit.
Ouvrez votre projet dans xcode, recherchez AppDelegate.Swift
et ajoutez ce qui suit:
let controller: FlutterViewController
= window?.rootViewController as! FlutterViewController;
controller.navigationController?
.interactivePopGestureRecognizer?.isEnabled = false;
MaterialPageRoute
a un paramètre appelé fullscreenDialog
qui est défini sur false par défaut. Lorsque c'est vrai, votre page s'anime un peu différemment et balayez pour revenir sur iOS sera désactivée.
Exemple d'utilisation:
Navigator.of(context).Push(
MaterialPageRoute(builder: (_) => HomePage(), fullscreenDialog: true));
Voir quelques discussions ici: https://github.com/flutter/flutter/issues/142
Je ne sais pas trop ce que vous voulez réaliser, mais la plupart du temps lorsque les gens veulent se débarrasser de la fonctionnalité de retour, car ils ne veulent pas permettre à l'utilisateur de contrôler le mécanisme d'authentification. Par exemple, après la connexion des utilisateurs, vous ne voulez pas qu'ils accèdent à la page de connexion en appuyant simplement sur le bouton de retour (ou en faisant glisser de nouveau dans iOS). Une solution potentielle consiste à utiliser pushNamedAndRemoveUntil
.
Future<T> pushNamedAndRemoveUntil<T extends Object>(BuildContext context, String newRouteName, RoutePredicate predicate)
Poussez l'itinéraire portant le nom donné sur le navigateur qui entoure le plus étroitement le contexte donné, puis supprimez tous les itinéraires précédents jusqu'à ce que
predicate
renvoie true.
Exemple de code: pushNamedAndRemoveUntil(context, '/home', ModalRoute.withName('/home'));
Remarque: utilisez cette méthode dans une certaine mesure, car vous pourriez gâcher votre historique de navigation.
Vous pouvez essayer ceci dans votre build 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>,
);
}