тріпотіння видалити кнопку назад на панелі програм


119

Мені цікаво, чи знає хтось про спосіб видалення кнопки "Назад", яка відображається appBarв додатку "Метушня", коли ви Navigator.pushNamedпереходите на іншу сторінку. Причина, по якій я не хочу цього на цій підсумковій сторінці, полягає в тому, що він надходить із навігації, і я хочу, щоб користувачі logoutзамість цього використовували кнопку, щоб сеанс починався спочатку .

Відповіді:


141

Ви можете видалити кнопку "Назад", передавши порожнє значення new Container()як leadingаргумент для вашого AppBar.

Однак якщо ви виявите, що робите це, ви, мабуть, не хочете, щоб користувач міг натискати кнопку назад пристрою, щоб повернутися до попереднього маршруту. Замість дзвінка pushNamedспробуйте зателефонувати, Navigator.pushReplacementNamedщоб зникнути попередній маршрут.

Повний зразок коду для останнього підходу наведено нижче.

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

Так, я змішав свої команди. Я спробую, дякую за вашу допомогу.
Роберт

2
@Collin, pushReplacementNamed, здається, не усуває можливості повернутися назад із системною стрілкою назад.
Jackpap

@Collin Jackson, чи має у pushReplacementNamed()своєму розпорядженні попередній віджет екрана (і всі залежно від даних та станів)?
Дмитро Блохін

@Jackpap це тому, що він дійсно показує стрілку, якщо є попередній маршрут. Якщо це єдиний маршрут, то повертатись вже нема до чого. У вашому випадку використовуйте порожній метод Container ().
ThinkDigital

1
Метод порожнього контейнера, здається, призводить до простору, де була б кнопка "Назад", тому заголовок Appbar трохи перемістився. Все ще не ідеальний метод.
Hasen

291

Я вважаю, що рішення наступні

Ви насправді:

  • Не хочете відображати цю потворну кнопку повернення (:]), і таким чином перейдіть за AppBar(...,automaticallyImplyLeading: false,...):;

  • Не хочу, щоб користувач повертався назад - замінюючи поточний вигляд - і таким чином переходив до Navigator.pushReplacementNamed(## your routename here ##):;

  • Не хочете, щоб користувач повернувся назад - замінивши певний вигляд назад у стеці - і, отже, використовуйте: Navigator.pushNamedAndRemoveUntil(## your routename here ##, f(Route<dynamic>)→bool); де f - це функція, що повертається trueпри зустрічі з останнім видом, який ви хочете зберегти в стеці (безпосередньо перед новим);

  • Не хочу, щоб користувач повертався назад - КОЛИ-небудь - спорожняючи стек навігатора повністю за допомогою: Navigator.pushNamedAndRemoveUntil(context, ## your routename here ##, (_) => false);

Ура


8
Це була відповідь, яку я шукав! pushReplacementNamed () не працював для мене, але користувач, який повертався коли-небудь, це те, що в кінцевому підсумку працювало! Дякую!
мости

1
справді це найкраща відповідь.
Jay Jeong

Дякую, мені довелося використовувати "pushReplacementNamed" замість "popAndPushNamed"
camillo777

156

Простий спосіб видалити кнопку повернення назад в AppBar - встановити automaticallyImplyLeadingзначення false.

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

Дякую за просте
Qutbuddin Bohra

Хоча це просто реалізувати, для даного сценарію Navigator.pushReplacementNamedце правильне рішення. Те, що ви пропонуєте, - це обхідний шлях, який, застосовуючи у всіх сценаріях, може врешті-решт зробити висновок про неправильну поведінку, наприклад, десь хтось хотів би, щоб AppBarпродовження означало провідну поведінку (тобто: кнопка зворотної навігації)
Гільерме Матуелла

35

Просто хочу додати якийсь опис до відповіді @Jackpap:

automaticallyImplyLeading:

Це перевіряє, чи хочемо ми застосувати задній віджет (провідний віджет) над панеллю програми чи ні. Якщо automaticImplyLeading хибне, тоді заголовку автоматично відводиться пробіл, і якщо Якщо провідний віджет істинний, то цей параметр не впливає.

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

4

// якщо ви хочете приховати кнопку повернення, використовуйте код нижче

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

// якщо ви хочете приховати кнопку повернення та зупинити поп-дію, використовуйте код нижче

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


[


3

Віджет AppBar має властивість під назвою automaticallyImplyLeading. За замовчуванням це значення true. Якщо ви не хочете, щоб флаттер автоматично створював для вас кнопку повернення, просто створіть властивість false.

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

Щоб додати власну кнопку повернення

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

0

При переході на іншу сторінку. Navigator.pushReplacement()може бути використаний. Його можна використовувати, якщо ви переходите з режиму входу на головний екран. Або ви можете використовувати.
AppBar(automaticallyImplyLeading: false)


0

Використовуйте це для щіток AppBar

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

Використовуйте це для звичайної панелі програм

 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,

),

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

Це працює добре


ми повинні забезпечити ведучий: новий контейнер () тег
Шиву
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.