web-dev-qa-db-fra.com

Comment désactiver ou annuler le bouton "RETOUR" d'Android dans Flutter?

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). 

16
Jackpap

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(),
        ),
      ),
    ),
  );
}
31
Rémi Rousselet

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"),
              )
          )
      ),
    );
  }
}
2
Bryan Cancel

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:

https://pub.dartlang.org/packages/back_button_interceptor

0
MarcG

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');
  },
)
0
icazevedo