Existe-t-il un moyen de désactiver le bouton de retour Android sur une page spécifique?
class WakeUpApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Time To Wake Up ?",
home: new WakeUpHome(),
routes: <String, WidgetBuilder>{
'/pageOne': (BuildContext context) => new pageOne(),
'/pageTwo': (BuildContext context) => new pageTwo(),
},
);
}
}
Sur pageOne j'ai un bouton pour aller à la pageDeux:
new FloatingActionButton(
onPressed: () {
Navigator.of(context).pushNamed('/pageTwo');
},
)
Mon problème est que si j'appuie sur la flèche Précédent en bas de l'écran Android, je retourne à la page Un. Je voudrais que ce bouton ne se montre pas du tout. Idéalement, je ne voudrais pas sortir de cet écran, sauf si l’utilisateur maintient son doigt appuyé sur cet écran pendant 5 secondes. (J'essaie d'écrire une application pour les tout-petits et je voudrais que seuls les parents puissent naviguer hors de l'écran en question).
La réponse est WillPopScope
. Cela empêchera la page d'être affichée par le système. Vous pourrez toujours utiliser Navigator.of(context).pop()
@override
Widget build(BuildContext context) {
return new WillPopScope(
onWillPop: () async => false,
child: new Scaffold(
appBar: new AppBar(
title: new Text("data"),
leading: new IconButton(
icon: new Icon(Icons.ac_unit),
onPressed: () => Navigator.of(context).pop(),
),
),
),
);
}
Je poste ceci ici au cas où quelqu'un le trouverait et souhaiterait trouver un exemple simple https://Gist.github.com/b-cancel/0ca372017a25f0c120b14dfca3591aa5
import 'package:flutter/material.Dart';
import 'Dart:async';
void main() => runApp(new BackButtonOverrideDemoWidget());
class BackButtonOverrideDemoWidget extends StatefulWidget{
@override
_BackButtonOverrideDemoWidgetState createState() => new _BackButtonOverrideDemoWidgetState();
}
class _BackButtonOverrideDemoWidgetState extends State<BackButtonOverrideDemoWidget> with WidgetsBindingObserver{
//-------------------------Test Variable
bool isBackButtonActivated = false;
//-------------------------Required For WidgetsBindingObserver
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
//-------------------------Function That Triggers when you hit the back key
@override
didPopRoute(){
bool override;
if(isBackButtonActivated)
override = false;
else
override = true;
return new Future<bool>.value(override);
}
//-------------------------Build Method
@override
Widget build(BuildContext context) {
return new Directionality(
textDirection: TextDirection.ltr,
child: new Container(
color: (isBackButtonActivated) ? Colors.green : Colors.red,
child: new Center(
child: new FlatButton(
color: Colors.white,
onPressed: () {
isBackButtonActivated = !isBackButtonActivated;
setState(() {});
},
child: (isBackButtonActivated) ?
new Text("DeActive the Back Button") : new Text("Activate the Back Button"),
)
)
),
);
}
}
Comme Rémi Rousselet l'a fait remarquer, WillPopScope
est généralement la voie à suivre. Toutefois, si vous développez un widget avec état qui devrait réagir directement au bouton Précédent, vous pouvez utiliser ceci:
Vous devez utiliser la méthode popAndPushNamed
au lieu de pushNamed
. Il ouvre la route actuelle et pousse la route souhaitée.
Cela étant dit, votre code FAB devrait ressembler à ceci
new FloatingActionButton(
onPressed: () {
Navigator.popAndPushNamed(context, '/pageTwo');
},
)