rung nút loại bỏ quay lại trên thanh ứng dụng


119

Tôi đang tự hỏi, nếu có ai biết cách để loại bỏ nút quay lại hiển thị trên appBarứng dụng trong một ứng dụng rung khi bạn sử dụng Navigator.pushNamedđể truy cập trang khác. Lý do tôi không muốn nó xuất hiện trên trang kết quả này là nó đến từ điều hướng và tôi muốn người dùng sử dụng logoutnút thay thế để phiên bắt đầu lại.

Câu trả lời:


141

Bạn có thể loại bỏ nút quay lại bằng cách chuyển một ô trống new Container()làm leadingđối số cho của bạn AppBar.

Tuy nhiên, nếu bạn thấy mình đang làm điều này, có lẽ bạn không muốn người dùng có thể nhấn nút quay lại của thiết bị để quay lại lộ trình trước đó. Thay vì gọi pushNamed, hãy thử gọi Navigator.pushReplacementNamedđể làm biến mất tuyến đường trước đó.

Dưới đây là mẫu mã đầy đủ cho cách tiếp cận thứ hai.

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

Vâng, tôi đã nhận được các lệnh của mình lẫn lộn. Tôi sẽ thử, Cảm ơn sự giúp đỡ của bạn.
Robert

2
@Collin, pushReplacementNamed dường như không loại bỏ khả năng quay lại với mũi tên quay lại của hệ thống.
Jackpap

@Collin Jackson, Có pushReplacementNamed()loại bỏ tiện ích màn hình trước đó không (và tất cả dữ liệu và trạng thái tùy thuộc)?
Dmitriy Blokhin

@Jackpap đó là vì nó thực sự hiển thị mũi tên nếu có một tuyến đường trước đó. Nếu đó là con đường duy nhất, thì không có gì để quay lại. Trong trường hợp của bạn, hãy sử dụng phương thức Container () trống.
ThinkDigital

1
Phương thức vùng chứa trống dường như dẫn đến một khoảng trống nơi nút quay lại sẽ ở đó để tiêu đề Appbar được di chuyển qua một chút. Vẫn không phải là một phương pháp lý tưởng.
Hasen

291

Tôi tin rằng các giải pháp là sau đây

Bạn thực sự:

  • Không muốn để hiển thị rằng nút quay lại xấu xí (:]), và do đó đi cho: AppBar(...,automaticallyImplyLeading: false,...);

  • Không muốn người dùng quay lại - thay thế chế độ xem hiện tại - và do đó chuyển sang Navigator.pushReplacementNamed(## your routename here ##):;

  • Không muốn người dùng quay lại - thay thế một khung nhìn nhất định trở lại trong ngăn xếp - và do đó sử dụng: Navigator.pushNamedAndRemoveUntil(## your routename here ##, f(Route<dynamic>)→bool); trong đó f là một hàm trả về truekhi gặp chế độ xem cuối cùng mà bạn muốn giữ trong ngăn xếp (ngay trước khung nhìn mới);

  • Không muốn người dùng quay lại - BAO GIỜ - làm trống hoàn toàn ngăn xếp điều hướng với: Navigator.pushNamedAndRemoveUntil(context, ## your routename here ##, (_) => false);

Chúc mừng


8
Đây là câu trả lời mà tôi đang tìm kiếm! pushReplacementNamed () không hoạt động với tôi, nhưng người dùng quay lại BAO GIỜ là những gì cuối cùng đã hoạt động! Cảm ơn bạn!
s.bridges

1
thực sự đây là câu trả lời tốt nhất.
Jay Jeong

Cảm ơn bạn, tôi đã phải sử dụng "pushReplacementNamed" thay vì "popAndPushNamed"
camillo777

155

Một cách đơn giản để loại bỏ nút quay lại trong AppBar là đặt automaticallyImplyLeadingthành false.

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

Cảm ơn bạn vì đơn giản
Qutbuddin Bohra

Mặc dù điều này đơn giản để thực hiện, nhưng đối với kịch bản đã cho, Navigator.pushReplacementNamedlà giải pháp chính xác. Những gì bạn đề xuất là một cách giải quyết mà nếu được áp dụng trong tất cả các tình huống, cuối cùng có thể suy ra hành vi sai, giống như một nơi nào đó mà ai đó muốn rằng AppBarhành vi đó tiếp tục ngụ ý hành vi hàng đầu (tức là: nút điều hướng quay lại)
Guilherme Matuella

35

Chỉ muốn thêm một số mô tả về câu trả lời @Jackpap:

autoImplyLeading:

Điều này sẽ kiểm tra xem chúng ta có muốn áp dụng tiện ích phía sau (tiện ích dẫn đầu) trên thanh ứng dụng hay không. Nếu automaticImplyLeading là false thì tiêu đề sẽ tự động cấp khoảng trắng và nếu tiện ích đứng đầu là true thì tham số này không có hiệu lực.

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

// nếu bạn muốn ẩn nút quay lại, hãy sử dụng mã bên dưới

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

// nếu bạn muốn ẩn nút quay lại và dừng hành động bật, hãy sử dụng mã bên dưới

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

Tiện ích con AppBar có một thuộc tính được gọi là automaticallyImplyLeading. Theo mặc định, giá trị của nó là true. Nếu bạn không muốn tự động xây dựng nút quay lại cho bạn thì chỉ cần tạo tài sản false.

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

Để thêm nút quay lại tùy chỉnh của bạn

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

0

Sử dụng cái này cho cúi AppBar

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

Sử dụng cái này cho Appbar bình thường

 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,

),

-1

Nếu điều hướng đến một trang khác. Navigator.pushReplacement()có thể được sử dụng. Nó có thể được sử dụng nếu bạn đang điều hướng từ đăng nhập đến màn hình chính. Hoặc bạn có thể sử dụng.
AppBar(automaticallyImplyLeading: false)


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

Nó đang hoạt động tốt


chúng tôi cần cung cấp thẻ hàng đầu: new Container ()
siva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.