webentwicklung-frage-antwort-db.com.de

fangen Sie das Android-Button-Ereignis bei Flutter

Gibt es eine Möglichkeit, das onBackPressed-Ereignis von der Android-Zurück-Schaltfläche zu erfassen?

Ich habe die WillPopScope ausprobiert, aber meine onWillPop-Funktion wurde nur ausgelöst, wenn ich auf die Schaltfläche mit dem Zurückpfeil für Material tippe

Ich habe es so ausgedrückt:

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

Ich muss es fangen, weil sich mein Bildschirm irgendwie unkorrekt verhalten hat, wenn er auf die Schaltfläche "Zurück" geklickt hat. Der Bildschirm und der Bildschirm darunter erscheinen, aber irgendwie funktioniert die Schaltfläche "Zurück" mit dem Material zurück.

aktualisieren:

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

Um das Zurücknavigieren zu verhindern, ist WillPopScope / der richtige Weg und sollte wie folgt verwendet werden:

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

Kann die Seite wie folgt aufrufen:

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

Verwenden Sie den folgenden Ansatz nicht für die Navigation, da beim aktuellen Flutter einige Probleme auftreten:

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

Dieser Code funktioniert für mich.

Ich denke, dass es zwei Gründe gibt.

  1. Kind von WillPopScope ist Scaffold
  2. Keine Rückgabe in 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
蔡旻袁

So habe ich meine implementiert und es funktioniert gut von mir. Sie können es ausprobieren.

@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