web-dev-qa-db-fra.com

attraper l'événement bouton retour Android sur Flutter

Puis-je attraper l'événement onBackPressed depuis le bouton retour d'Android?

J'ai essayé la variable WillPopScope mais ma fonction onWillPop ne s'est déclenchée que lorsque je clique sur le bouton fléché Retour de la matière

Je le mets comme ça:

class MyView extends StatelessWidget{

Widget build(BuildContext context) {

    return new WillPopScope(
      onWillPop: () async {
        debugPrint("Will pop");
        return true;
      },
      child: ScopedModel<AppModel>(
      model: new AppModel(),
      child: new Scaffold(......

Je dois le comprendre car mon écran s’est mal comporté lorsqu’il a été appuyé sur le bouton précédent, l’écran et l’écran situé en dessous s’affiche, mais d’une manière ou d’une autre, l’utilisation du bouton fléché vers l’arrière fonctionne de manière normale.

mettre à jour:

the code works, my problem was not in the pop of this screen, but on the previous screen, I use 2 MaterialApp widgets, and somehow it gave a weird behavior.
6
Rizky Andriawan

Pour éviter de revenir en arrière WillPopScope est le bon moyen et doit être utilisé comme suit:

class Page2Route extends MaterialPageRoute {
  Page2Route() : super(builder: (context) => new Page2());
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text('Page 2'),
        ),
        body: new Center(
          child: new Text('PAGE 2'),
        ),
      ),
      onWillPop: () {
        return new Future(() => false);
      },
    );
  }
}

Peut appeler la page comme:

Navigator.of(context).Push(new Page2Route());

Ne pas utiliser l'approche ci-dessous pour la navigation, car il y a quelques problèmes avec le dernier Flutter:

Navigator.Push(context, new Page2Route());
5
Arnold Parge

Ce code fonctionne pour moi.

Je pense qu'il peut y avoir deux raisons.

  1. Child of WillPopScope est échafaud
  2. Aucun retour dans onWillPop

    return new WillPopScope(
      onWillPop: () {
        if (!_isOpened) Navigator.pop(context);
      },
      child: new Scaffold(
        key: SharedService.orderScaffoldKey,
        appBar: appBar,
        body: new Builder(
          builder: (BuildContext context) {
            return page;
          },
        ),
      ),
    );
    
0
蔡旻袁

C’est ainsi que j’ai mis en œuvre le mien et que cela fonctionne bien pour moi. Vous pouvez l'essayer.

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: () {
      _moveToSignInScreen(context);
    },
    child: Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
              _moveToSignInScreen(context);
            }),
        title: Text("Profile"),
      ),
    ),
  );
}

void _moveToSignInScreen(BuildContext context) =>
    Navigator.pushReplacementNamed(context, Routes.keySignIn);
0
Mitch