Флаттер удалить кнопку назад на панели приложений

Мне интересно, если кто-нибудь знает способ убрать кнопку "Назад", которая появляется на appBar в приложении флаттера, когда вы используете Navigator.popNamed чтобы перейти на другую страницу, причина, по которой я не хочу, чтобы она появлялась на этой странице, заключается в том, что она поступает из навигации, и я хочу, чтобы пользователи использовали logout вместо этого, чтобы сессия началась заново.

Любая помощь будет отличной.

заранее спасибо

19 ответов

Решение

Там нет метода с именем popNamed, Я полагаю, вы имели в виду pushNamed,

Вы можете удалить кнопку возврата, передав пустую 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(),
      },
    );
  }
}

Я считаю, что решения следующие

Вы на самом деле либо:

  • Не хочу отображать эту уродливую кнопку "назад" (:]) и, следовательно, перейти к: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);

ура

Простой способ удалить кнопку "Назад" в панели приложений - автоматически установить значение "ImplyLeading" в значение "ложь".

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

Просто хочу добавить описание к ответу @Jackpap:

automaticallyImplyLeading:

Это проверяет, хотим ли мы применить задний виджет (ведущий виджет) над панелью приложения или нет. Если automaticImplyLeading имеет значение false, то заголовку автоматически присваивается пробел, а если лидирующий виджет имеет значение true, то этот параметр не имеет никакого эффекта.

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

просто используйте автоматическиImplyLeading в AppBar()

      appBar: AppBaar(
  automaticallyImplyLeading: false,
)

Используйте это для ленты 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,

),

// если вы хотите скрыть кнопку возврата, используйте код ниже

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

ht tps://stackru.com/ images/c5bc409940ddbfb98017a6e2ca1f9371666e7083.png

Добавлять automaticallyImplyLeading: false, в панель приложений вашего скаффолда

У виджета 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(),
),

При переходе на другую страницу. Navigator.pushReplacement()может быть использован. Его можно использовать, если вы переходите от входа к главному экрану. Или вы можете использовать.
AppBar(automaticallyImplyLeading: false)

SliverAppBar(automaticImplyLeading: false,}

Установите автоматически ImplyLeading в false в AppBar

appBar: new AppBar(
   title: new Text("Your Text Here"), 
   automaticallyImplyLeading: false,
),

в панели приложений поместитеautomaticallyImplyLeadingв ложном:

        @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        automaticallyImplyLeading: false,

Когда вы используетестрелка назад автоматически появляется на панели приложений нового экрана для возврата к предыдущему экрану. Если вам не нужна эта функциональность, все, что вам нужно сделать, это написатьв ваших свойствах appBar.

кнопку легко найти в main.dart или в любом месте, которое я установил в main.dart

изменить это

Навигатор.push(

к

         Navigator.pushReplacement(

Просто сделайте это прозрачным, и никаких действий при нажатии

      AppBar(
            leading: IconButton(
              icon: Icon(
                Icons.arrow_back,
                color: Colors.white.withOpacity(0),
              ),
              onPressed: () {},
            ),

Если вы хотите удалить пространство, а также установитеtitleSpacing:0.

       appBar: AppBar(
        title: Text("How do you rate us?"),
        automaticallyImplyLeading: false,
        titleSpacing: 0,
        actions: [
          IconButton(
              onPressed: () {
                Navigator.pop(context);
              },
              icon: Icon(Icons.close))
        ],
      ),

во флаттере >= 3.10 устанавливается автоматическиImplyLeading: false,

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

Работает отлично

Другие вопросы по тегам