flutter appbar'daki geri kaldır düğmesi


135

Merak ediyorum, başka bir sayfaya gitmek için appBarkullandığınızda bir flutter uygulamasında görünen geri düğmesini kaldırmanın bir yolunu bilen var mı Navigator.pushNamed? Ortaya çıkan bu sayfada istemememin nedeni, navigasyondan geliyor olması ve kullanıcıların logoutbunun yerine düğmeyi kullanmasını istiyorum , böylece oturum baştan başlar.

Yanıtlar:


159

Geri düğmesini new Container(), leadingargüman olarak bir boş geçerek kaldırabilirsiniz AppBar.

Kendinizi bunu yaparken bulursanız, muhtemelen kullanıcının önceki rotaya geri dönmek için cihazın geri düğmesine basmasını istemezsiniz. Aramak yerine , önceki rotanın kaybolmasına neden olmak için pushNamedaramayı deneyin Navigator.pushReplacementNamed.

İşlev pushReplacementNamed, arkadaki önceki rotayı kaldıracak ve yeni rotayla değiştirecektir.

İkincisi için tam kod örneği aşağıdadır.

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

Evet, komutlarımı karıştırdım. Bir deneyeceğim, yardımın için teşekkürler.
Robert

2
@Collin, pushReplacementNamed, sistem geri okuyla geri dönme olasılığını ortadan kaldırmıyor gibi görünüyor.
Jackpap

@Collin Jackson, pushReplacementNamed()önceki ekran widget'ını (ve tüm verileri ve durumları) atıyor mu ?
Dmitriy Blokhin

@Jackpap, çünkü önceki bir rota varsa oku gerçekten gösteriyor. Tek yol buysa, geri dönecek bir şey yok. Sizin durumunuzda, boş Container () yöntemini kullanın.
ThinkDigital

1
Boş kap yöntemi, geri düğmesinin olduğu bir boşlukla sonuçlanıyor gibi görünüyor, böylece Appbar başlığı hafifçe hareket ettiriliyor. Yine de ideal bir yöntem değil.
Hasen

328

Çözümlerin aşağıdaki olduğuna inanıyorum

Aslında siz:

  • O çirkin geri düğmesini (:]) görüntülemek istemeyin ve bu nedenle gidin AppBar(...,automaticallyImplyLeading: false,...):;

  • Kullanıcının geri dönmesini - mevcut görünümü değiştirmesini - ve bunun için gidin Navigator.pushReplacementNamed(## your routename here ##):;

  • Kullanıcının geri dönmesini istemiyorum - yığındaki belirli bir görünümü tekrar değiştirin - ve bu nedenle şunu kullanın: Navigator.pushNamedAndRemoveUntil(## your routename here ##, f(Route<dynamic>)→bool); burada f, trueyığında tutmak istediğiniz son görünümle karşılaştığınızda geri dönen bir işlevdir (yenisinden hemen önce);

  • Kullanıcının geri dönmesini istemiyorum - ASLA - gezinme yığınını aşağıdakilerle tamamen boşaltın: Navigator.pushNamedAndRemoveUntil(context, ## your routename here ##, (_) => false);

Şerefe


8
Bu aradığım cevaptı! pushReplacementNamed () benim için çalışmıyordu, ancak ASLA geri dönen kullanıcı işe yaradı! Teşekkür ederim!
s.bridges

1
gerçekten de bu en iyi cevap.
Jay Jeong

Teşekkürler, "popAndPushNamed" yerine "pushReplacementNamed" kullanmak zorunda kaldım
camillo777

İşaretli cevap bu olmalıdır
Bright

1
İyi Cevap, teşekkür @Fabio
Kamlesh

170

AppBar geri düğmesine kaldırmak için basit bir yolu kümesine olduğu automaticallyImplyLeadingiçin false.

appBar: AppBar(
  title: Text("App Bar without Back Button"),
  automaticallyImplyLeading: false,
),

Basit olduğunuz için teşekkürler
Qutbuddin Bohra

1
Uygulanması basit olsa da, verilen senaryo Navigator.pushReplacementNamediçin doğru çözüm budur. Önerdiğiniz şey, tüm senaryolara uygulandığında, sonunda yanlış davranış sonucuna varabilecek bir geçici çözümdür, örneğin birinin hoşuna gidecek bir yer AppBar, önde gelen davranışı ima etmeye devam eder (yani: geri gezinme düğmesi)
Guilherme Matuella

Geri ok simgesini kaldırmasına rağmen, yine de cihazın geri düğmesine basarak geri dönebilirsiniz
vishalknishad

Keşke bir cevabı daha aşağıda okuyabilseydim, sorunun gerçek cevabına ulaşırdım. Teşekkürler 🙏
Gregory Ray

36

@ Jackpap cevabının üzerine bir açıklama eklemek istiyorum:

automaticImplyLeading:

Bu, arka widget'ı (önde gelen widget) uygulama çubuğunun üzerine uygulamak isteyip istemediğimizi kontrol eder. AutomaticImplyLeading false ise, o zaman başlığa otomatik olarak boşluk verilir ve baştaki widget true ise bu parametrenin hiçbir etkisi olmaz.

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

8

Şeritler için bunu kullanın AppBar

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

Bunu normal Appbar için kullanın

 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,

),

7

// geri düğmesini gizlemek istiyorsanız aşağıdaki kodu kullanın

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

// geri düğmesini gizlemek ve pop eylemini durdurmak istiyorsanız aşağıdaki kodu kullanın

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


[


5

AppBar widget'ının adlı bir özelliği vardır automaticallyImplyLeading. Varsayılan olarak değeri true. Flutter'ın sizin için otomatik olarak geri düğmesini oluşturmasını istemiyorsanız, sadece özelliği oluşturun false.

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

Özel geri düğmenizi eklemek için

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

3

Başka bir sayfaya gidiyorsanız. Navigator.pushReplacement()kullanılabilir. Giriş ekranından ana ekrana geçiyorsanız kullanılabilir. Veya kullanabilirsiniz.
AppBar(automaticallyImplyLeading: false)


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

İyi çalışıyor


önde gelen: yeni Container () etiketi
siva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.