Flattern entfernen Zurück-Taste auf Appbar

117

Ich frage mich, ob jemand eine Möglichkeit kennt, die Zurück-Schaltfläche zu entfernen, die appBarin einer Flatter-App angezeigt wird, wenn Sie Navigator.pushNamedzu einer anderen Seite wechseln. Der Grund, warum ich es auf dieser resultierenden Seite nicht möchte, ist, dass es von der Navigation stammt und ich möchte, dass Benutzer logoutstattdessen die Schaltfläche verwenden, damit die Sitzung von vorne beginnt.

Robert
quelle

Antworten:

139

Sie können die Zurück-Schaltfläche entfernen, indem Sie ein Leerzeichen new Container()als leadingArgument an Ihre übergeben AppBar.

Wenn Sie dies jedoch tun, möchten Sie wahrscheinlich nicht, dass der Benutzer die Zurück-Taste des Geräts drücken kann, um zur früheren Route zurückzukehren. pushNamedVersuchen Sie, anstatt anzurufen , anzurufen, Navigator.pushReplacementNameddamit die frühere Route verschwindet.

Das vollständige Codebeispiel für den letzteren Ansatz finden Sie unten.

import 'package:flutter/material.dart';

class LogoutPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Logout Page"),
      ),
      body: new Center(
        child: new Text('You have been logged out'),
      ),
    );
  }

}
class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Remove Back Button"),
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.fullscreen_exit),
        onPressed: () {
          Navigator.pushReplacementNamed(context, "/logout");
        },
      ),
    );
  }
}

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(),
      routes: {
        "/logout": (_) => new LogoutPage(),
      },
    );
  }
}
Collin Jackson
quelle
Ja, ich habe meine Befehle durcheinander gebracht. Ich werde es versuchen, Danke für Ihre Hilfe.
Robert
2
@Collin, pushReplacementNamed scheint nicht die Möglichkeit auszuschließen, mit dem Systemrückpfeil zurückzukehren.
Jackpap
@Collin Jackson, Entsorgt pushReplacementNamed()das vorherige Bildschirm-Widget (und alle abhängigen Daten und Zustände)?
Dmitriy Blokhin
@Jackpap, weil es wirklich den Pfeil zeigt, wenn es eine vorherige Route gibt. Wenn es die einzige Route ist, gibt es nichts, zu dem man zurückkehren kann. Verwenden Sie in Ihrem Fall die leere Container () -Methode.
ThinkDigital
1
Die Methode für leere Container scheint zu einem Leerzeichen zu führen, in dem sich die Schaltfläche "Zurück" befunden hätte, sodass der Appbar-Titel leicht verschoben wird. Immer noch keine ideale Methode.
Hasen
285

Ich glaube, die Lösungen sind die folgenden

Sie tatsächlich entweder:

  • Ich möchte diesen hässlichen Zurück-Button (:]) nicht anzeigen und gehe daher zu : AppBar(...,automaticallyImplyLeading: false,...);

  • Ich möchte nicht, dass der Benutzer zurückkehrt - die aktuelle Ansicht ersetzt - und sich daher für Folgendes entscheidet : Navigator.pushReplacementNamed(## your routename here ##);

  • Sie möchten nicht, dass der Benutzer zurückkehrt und eine bestimmte Ansicht im Stapel ersetzt. Verwenden Sie daher Folgendes: Navigator.pushNamedAndRemoveUntil(## your routename here ##, f(Route<dynamic>)→bool); wobei f eine Funktion ist, die zurückkehrt, truewenn Sie die letzte Ansicht treffen, die Sie im Stapel behalten möchten (direkt vor der neuen).

  • Ich möchte nicht, dass der Benutzer zurückkehrt - NIEMALS - und den Navigatorstapel vollständig leert mit: Navigator.pushNamedAndRemoveUntil(context, ## your routename here ##, (_) => false);

Prost

Fabio Veronese
quelle
8
Dies war die Antwort, nach der ich gesucht habe! pushReplacementNamed () hat bei mir nicht funktioniert, aber der Benutzer, der EVER zurückkehrt, hat am Ende funktioniert! Danke dir!
Brücken
1
in der Tat ist dies die beste Antwort.
Jay Jeong
Vielen Dank, ich musste "pushReplacementNamed" anstelle von "popAndPushNamed" verwenden
camillo777
154

Eine einfache Möglichkeit, die Zurück-Schaltfläche in der AppBar zu entfernen, ist die Einstellung automaticallyImplyLeadingauf false.

appBar: AppBar(
  title: Text("App Bar without Back Button"),
  automaticallyImplyLeading: false,
),
Jackpap
quelle
Vielen Dank für die einfache
Qutbuddin Bohra
Dies ist zwar einfach zu implementieren, für das gegebene Szenario Navigator.pushReplacementNamedjedoch die richtige Lösung. Was Sie vorschlagen, ist eine Problemumgehung, die, wenn sie in allen Szenarien angewendet wird, möglicherweise auf falsches Verhalten schließen lässt, z. B. irgendwo, wo jemand dies AppBar
wünscht. Dies
34

Ich möchte nur eine Beschreibung über @Jackpap hinzufügen. Antwort:

automatischImplyLeading:

Dies prüft, ob wir das hintere Widget (führendes Widget) über die App-Leiste anwenden möchten oder nicht. Wenn autoImplyLeading false ist, wird dem Titel automatisch Platz eingeräumt. Wenn das führende Widget true ist, hat dieser Parameter keine Auswirkung.

void main() {
  runApp(
    new MaterialApp(
      home: new Scaffold(
        appBar: AppBar(
          automaticallyImplyLeading: false, // Used for removing back buttoon. 
          title: new Center(
            child: new Text("Demo App"),
          ),
        ),
        body: new Container(
          child: new Center(
            child: Text("Hello world!"),
          ),
        ),
      ),
    ),
  );
}  
jitsm555
quelle
4

// Wenn Sie die Schaltfläche "Zurück" ausblenden möchten, verwenden Sie den folgenden Code

class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: AppBar(
    title: Text('Remove Back Button'),
    
    //hide back button
    automaticallyImplyLeading: false,
   ),
  body: Center(
    child: Container(),
  ),
);
}
}

// Wenn Sie die Zurück-Schaltfläche ausblenden und die Pop-Aktion stoppen möchten, verwenden Sie den folgenden Code

class SecondScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
 return new WillPopScope(

  onWillPop: () async => false,
  child: Scaffold(
    appBar: AppBar(
      title: Text("Second Screen"),
      //For hide back button
      automaticallyImplyLeading: false,
    ),
    body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text('Back'),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
          ],
        )
    ),
  ),
);
 }

[

ShigaSuresh
quelle
3

Das AppBar-Widget hat eine Eigenschaft namens automaticallyImplyLeading. Standardmäßig ist der Wert true. Wenn Sie nicht möchten, dass das Flattern automatisch den Zurück-Button für Sie erstellt, erstellen Sie einfach die Eigenschaft false.

appBar: AppBar(
  title: Text("YOUR_APPBAR_TITLE"), 
  automaticallyImplyLeading: false,
),

So fügen Sie Ihre benutzerdefinierte Zurück-Schaltfläche hinzu

appBar: AppBar(
  title: Text("YOUR_APPBAR_TITLE"), 
  automaticallyImplyLeading: false,
  leading: YOUR_CUSTOM_WIDGET(),
),
Ahammed Hossain Shanto
quelle
-1

Wenn Sie zu einer anderen Seite navigieren. Navigator.pushReplacement()kann verwendet werden. Es kann verwendet werden, wenn Sie vom Login zum Startbildschirm navigieren. Oder Sie können verwenden.
AppBar(automaticallyImplyLeading: false)

SR Keshav
quelle
-2
  appBar: new AppBar(title: new Text("SmartDocs SPAY"),backgroundColor: Colors.blueAccent, automaticallyImplyLeading:false,
        leading: new Container(),
      ),

Es funktioniert gut

Siva
quelle
wir müssen das führende: neue Container () -Tag
bereitstellen