Флаттер удалить кнопку назад на панели приложений
Мне интересно, если кто-нибудь знает способ убрать кнопку "Назад", которая появляется на 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)
Установите автоматически 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,
Когда вы используете
кнопку легко найти в 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(),
),
Работает отлично