trzepotanie usuń przycisk Wstecz na pasku aplikacji

123

Zastanawiam się, czy ktoś zna sposób na usunięcie przycisku Wstecz, który pojawia się appBarw aplikacji trzepoczącej, gdy używasz, Navigator.pushNamedaby przejść do innej strony. Powodem, dla którego nie chcę tego na tej stronie wynikowej, jest to, że pochodzi z nawigacji i chcę, aby użytkownicy logoutzamiast tego używali przycisku, aby sesja zaczęła się od nowa.

Robert
źródło

Odpowiedzi:

145

Możesz usunąć przycisk Wstecz, przekazując pusty new Container()jako leadingargument do swojegoAppBar .

Jeśli jednak okaże się, że to robisz, prawdopodobnie nie chcesz, aby użytkownik mógł nacisnąć przycisk Wstecz urządzenia, aby wrócić na wcześniejszą trasę. Zamiast dzwonić pushNamed, spróbuj zadzwonić, Navigator.pushReplacementNamedaby spowodować zniknięcie wcześniejszej trasy.

Pełny przykład kodu dla tego drugiego podejścia znajduje się poniżej.

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
źródło
Tak, pomyliłem moje polecenia. Spróbuję, dzięki za pomoc.
Robert,
2
@Collin, pushReplacementNamed nie wydaje się usuwać możliwości powrotu z systemową strzałką wstecz.
Jackpap
@Collin Jackson, czy usuwa pushReplacementNamed()widżet poprzedniego ekranu (i wszystkie zależne dane i stany)?
Dmitriy Błochin
@Jackpap to dlatego, że naprawdę pokazuje strzałkę, jeśli istnieje poprzednia trasa. Jeśli to jedyna trasa, to nie ma do czego wracać. W twoim przypadku użyj pustej metody Container ().
ThinkDigital
1
Wydaje się, że metoda pustego kontenera powoduje powstanie spacji, w której znajdowałby się przycisk Wstecz, więc tytuł paska aplikacji jest lekko przesuwany. Wciąż nie jest to idealna metoda.
Hasen
303

Uważam, że rozwiązania są następujące

W rzeczywistości albo:

  • Nie chcę wyświetlać tego brzydkiego przycisku Wstecz (:]), więc idź do AppBar(...,automaticallyImplyLeading: false,...):;

  • Nie chcę, aby użytkownik cofał się - zastępując bieżący widok - i w ten sposób przechodził do Navigator.pushReplacementNamed(## your routename here ##):;

  • Nie chcę, aby użytkownik wracał - zastępując pewien widok z powrotem w stosie - i dlatego użyj: Navigator.pushNamedAndRemoveUntil(## your routename here ##, f(Route<dynamic>)→bool); gdzie f jest funkcją zwracającą się truepo spotkaniu z ostatnim widokiem, który chcesz zachować na stosie (tuż przed nowym);

  • Nie chcę, aby użytkownik wracał - NIGDY - całkowicie opróżniając stos nawigatora za pomocą: Navigator.pushNamedAndRemoveUntil(context, ## your routename here ##, (_) => false);

Twoje zdrowie

Fabio Veronese
źródło
8
To była odpowiedź, której szukałem! pushReplacementNamed () nie działał dla mnie, ale użytkownik, który cofnął się NIGDY, skończył działać! Dziękuję Ci!
s
1
rzeczywiście jest to najlepsza odpowiedź.
Jay Jeong,
Dziękuję, musiałem użyć „pushReplacementNamed” zamiast „popAndPushNamed”
camillo777
To powinna być zaznaczona odpowiedź
Bright
158

Prosty sposób, aby usunąć przycisk wstecz w AppBar jest zestaw automaticallyImplyLeadingdo false.

appBar: AppBar(
  title: Text("App Bar without Back Button"),
  automaticallyImplyLeading: false,
),
Jackpap
źródło
Dziękuję za proste
Qutbuddin Bohra
Chociaż jest to proste do wdrożenia, dla danego scenariusza Navigator.pushReplacementNamedjest to właściwe rozwiązanie. Sugerujesz obejście, które jeśli zostanie zastosowane we wszystkich scenariuszach, może ostatecznie wywnioskować niewłaściwe zachowanie, na przykład gdzieś, że ktoś chciałby, aby AppBarnadal sugerowało wiodące zachowanie (tj .: przycisk nawigacji wstecz)
Guilherme Matuella
35

Po prostu chcę dodać opis nad odpowiedzią @Jackpap:

automatycznie ImplyLeading:

To sprawdza, czy chcemy zastosować tylny widżet (wiodący widżet) na pasku aplikacji, czy nie. Jeśli parametr automaticImplyLeading ma wartość false, to w tytule jest automatycznie przydzielana spacja, a jeśli widget wiodący ma wartość true, to parametr ten nie ma znaczenia.

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
źródło
5

// jeśli chcesz ukryć przycisk Wstecz, użyj poniższego kodu

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

// jeśli chcesz ukryć przycisk Wstecz i zatrzymać akcję pop, użyj poniższego kodu

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
źródło
4

Widżet AppBar ma właściwość o nazwie automaticallyImplyLeading. Domyślnie jest to wartość true. Jeśli nie chcesz, aby flutter automatycznie tworzył przycisk Wstecz, po prostu utwórz właściwość false.

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

Aby dodać niestandardowy przycisk Wstecz

appBar: AppBar(
  title: Text("YOUR_APPBAR_TITLE"), 
  automaticallyImplyLeading: false,
  leading: YOUR_CUSTOM_WIDGET(),
),
Ahammed Hossain Shanto
źródło
3

Jeśli przechodzisz do innej strony. Navigator.pushReplacement()może być użyty. Może być używany, jeśli przechodzisz od logowania do ekranu głównego. Lub możesz użyć.
AppBar(automaticallyImplyLeading: false)

SR Keshav
źródło
2

Użyj tego dla taśm AppBar

SliverAppBar (
        automaticallyImplyLeading: false,
        elevation: 0,
        brightness: Brightness.light,
        backgroundColor: Colors.white,
        pinned: true,
      ),

Użyj tego dla zwykłego paska aplikacji

 appBar: AppBar(
    title: Text
    ("You decide on the appbar name"
    style: TextStyle(color: Colors.black,), 
    elevation: 0,
    brightness: Brightness.light,
    backgroundColor: Colors.white,
    automaticallyImplyLeading: false,

),
Rabat Kobby
źródło
-2
  appBar: new AppBar(title: new Text("SmartDocs SPAY"),backgroundColor: Colors.blueAccent, automaticallyImplyLeading:false,
        leading: new Container(),
      ),

Działa dobrze

śiwa
źródło
musimy podać wiodący: nowy tag Container ()
siva