Cách thay đổi màu nút quay lại appBar


104

Tôi không thể tìm ra cách thay đổi nút quay lại tự động của appBar thành một màu khác. nó nằm dưới một giàn giáo và tôi đã cố gắng nghiên cứu nó nhưng tôi không thể quấn lấy nó.

return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        title: Image.asset(
          'images/.jpg',
          fit: BoxFit.fill,
        ),
        centerTitle: true,
      ),

Câu trả lời:


289

Bạn phải sử dụng thuộc iconThemetính từ AppBar, như sau:

appBar: AppBar(
  iconTheme: IconThemeData(
    color: Colors.black, //change your color here
  ),
  title: Text("Sample"),
  centerTitle: true,
),

Hoặc nếu bạn muốn tự mình xử lý nút quay lại.

appBar: AppBar(
  leading: IconButton(
    icon: Icon(Icons.arrow_back, color: Colors.black),
    onPressed: () => Navigator.of(context).pop(),
  ), 
  title: Text("Sample"),
  centerTitle: true,
),

Thậm chí tốt hơn, chỉ khi bạn muốn thay đổi màu của nút quay lại.

appBar: AppBar(
  leading: BackButton(
     color: Colors.black
   ), 
  title: Text("Sample"),
  centerTitle: true,
),

3
Có cơ hội nào chúng ta có thể thay thế Biểu tượng trong ứng dụng AppBar ngay lập tức, thay vào đó đưa vào tất cả các màn hình bằng AppBar không?
djalmafreestyler

1
@djalmafreestyler Tạo một widget tùy chỉnh như thế ParentPagevà ở đó bạn có thể thêm appBar một lần và ở mọi nơi bạn có thể sử dụng nó thay vìScaffold
Sisir

36

bạn cũng có thể ghi đè mũi tên quay lại mặc định bằng một tiện ích mà bạn chọn, thông qua 'hàng đầu':

leading: new IconButton(
  icon: new Icon(Icons.arrow_back, color: Colors.orange),
  onPressed: () => Navigator.of(context).pop(),
), 

tất cả những gì widget AppBar làm là cung cấp một widget 'hàng đầu' mặc định nếu nó chưa được đặt.


1
Không hoàn toàn đúng vì AppBarnó cũng sẽ hiển thị nút quay lại khi nhấn a ModalRoute.
creativecreatorormaybenot

2
Và đặt automaticallyImplyLeading: falsetrong AppBar.
Loolooii

1
Upvoted cho Navigator.of(context).pop();thanks dude
Fadhly Permata

1
điều gì sẽ xảy ra nếu tôi đã xóa tất cả lịch sử điều hướng! mã này sẽ sụp đổ!
Shady Mohamed Sherif

sau đó kiểm tra xem bạn có thể bật lên hay không: if (Navigator.canPop (context)) {Navigator.pop (context); } else {// làm gì đó}}
blaneyneil

13

Có vẻ dễ dàng hơn khi chỉ cần tạo một nút mới và thêm màu vào đó, đây là cách tôi đã làm điều đó cho bất kỳ ai đang thắc mắc

Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: BackButton(
            color: Colors.black
        ),

1
Làm việc đẹp. Giải pháp ngắn gọn nhất của tất cả.
Hashir Baig

3
AppBar(        
    automaticallyImplyLeading: false,
    leading: Navigator.canPop(context)
        ? IconButton(
            icon: Icon(
              Icons.arrow_back,
              color: Colors.black,
              size: 47,
            ),
            onPressed: () => Navigator.of(context).pop(),
          )
        : null,
);

2

Bạn cũng có thể đặt màu biểu tượng hàng đầu trên toàn cầu cho ứng dụng

MaterialApp(
  theme: ThemeData(
    appBarTheme: AppBarTheme(
      iconTheme: IconThemeData(
        color: Colors.green
      )
    )
  )
)

1

Bạn có thể tùy chỉnh AppBarWidget , từ khóa với là quan trọng hoặc bạn có thể gán AppBarWidget tùy chỉnh của mình cho thuộc tính appBar của Scaffold :

import 'package:flutter/material.dart';

double _getAppBarTitleWidth(
    double screenWidth, double leadingWidth, double tailWidth) {
  return (screenWidth - leadingWidth - tailWidth);
}

class AppBarWidget extends StatelessWidget with PreferredSizeWidget {
  AppBarWidget(
      {Key key,
      @required this.leadingChildren,
      @required this.tailChildren,
      @required this.title,
      this.leadingWidth: 110,
      this.tailWidth: 30})
      : super(key: key);

  final List<Widget> leadingChildren;
  final List<Widget> tailChildren;
  final String title;
  final double leadingWidth;
  final double tailWidth;

  @override
  Widget build(BuildContext context) {
    // Get screen size
    double _screenWidth = MediaQuery.of(context).size.width;

    // Get title size
    double _titleWidth =
        _getAppBarTitleWidth(_screenWidth, leadingWidth, tailWidth);

    double _offsetToRight = leadingWidth - tailWidth;

    return AppBar(
      title: Row(
        children: [
          Container(
            width: leadingWidth,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.start,
              children: leadingChildren,
            ),
          ),
          Container(
            color: Colors.green,
            width: _titleWidth,
            padding: const EdgeInsets.only(left: 5.0, right: 5),
            child: Container(
              padding: EdgeInsets.only(right: _offsetToRight),
              color: Colors.deepPurpleAccent,
              child: Center(
                child: Text('$title'),
              ),
            ),
          ),
          Container(
            color: Colors.amber,
            width: tailWidth,
            child: Row(
              children: tailChildren,
            ),
          )
        ],
      ),
      titleSpacing: 0.0,
    );
  }

  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight);
}

Sau đây là ví dụ về cách sử dụng nó:

import 'package:flutter/material.dart';
import 'package:seal_note/ui/Detail/DetailWidget.dart';
import 'package:seal_note/ui/ItemListWidget.dart';

import 'Common/AppBarWidget.dart';
import 'Detail/DetailPage.dart';

class MasterDetailPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _MasterDetailPageState();
}

class _MasterDetailPageState extends State<MasterDetailPage> {
  @override
  Widget build(BuildContext context) { 
    return Scaffold(
      appBar: AppBarWidget(leadingChildren: [
        IconButton(
          icon: Icon(
            Icons.arrow_back_ios,
            color: Colors.white,
          ),
        ),
        Text(
          '文件夹',
          style: TextStyle(fontSize: 14.0),
        ),
      ], tailChildren: [
        Icon(Icons.book),
        Icon(Icons.hd),
      ], title: '英语知识',leadingWidth: 140,tailWidth: 50,),
      body: Text('I am body'),
    );
  }
}

0
  appBar: AppBar(
          iconTheme: IconThemeData(
            color: Colors.white, //modify arrow color from here..
          ),
      );

1
Thêm một số ngữ cảnh vào câu trả lời, câu trả lời chỉ có mã không được khuyến khích.
Arun Vinoth

0

Để thay đổi màu hàng đầu cho CupertinoPageScaffold

Theme(
  data: Theme.of(context).copyWith(
    cupertinoOverrideTheme: CupertinoThemeData(
      scaffoldBackgroundColor: Colors.white70,
      primaryColor: Styles.green21D877, // HERE COLOR OF LEADING
    ),
  ),
  child: CupertinoPageScaffold(
    navigationBar: CupertinoNavigationBar(
      brightness: Brightness.light,
      backgroundColor: Colors.white,
      middle: Text('Cupertino App Bar'),
    ),
    child: Container(
      child: Center(
        child: CupertinoActivityIndicator(),
      ),
    ),
  ),
)
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.