Flutter: Đặt chiều cao của AppBar


106

Làm cách nào để tôi có thể đơn giản đặt chiều cao của AppBartrong Flutter?

Tiêu đề của thanh phải được căn giữa theo chiều dọc (trong đó AppBar).


@Mans Đó là về 'nhận' chiều cao của AppBar, không phải 'thiết lập' nó.
Buğra Ekuklu

1
Bạn đã xem qua cái này chưa? Bạn cũng có thể tạo widget của riêng mình dưới dạng AppBar và đặt chiều cao của nó.
Bostrot

@Leviathlon tệ của tôi. kiểm tra câu trả lời của tôi cho (hy vọng) một số giúp đỡ tốt hơn
Mans

Câu trả lời:


198

Bạn có thể sử dụng PreferredSize :

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      home: Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(50.0), // here the desired height
          child: AppBar(
            // ...
          )
        ),
        body: // ...
      )
    );
  }
}

5
Điều này làm tăng kích thước của AppBar, nhưng không căn giữa văn bản.
Duncan Jones

5
Bạn có thể sử dụng thuộc centerTitletính để căn giữa nó.
CopsOnRoad,

11
@CopsOnRoad Điều đó căn giữa nó theo chiều ngang nhưng không căn giữa theo chiều dọc.
Giraldi

1
@Giraldi Bạn có thể không thực sự làm điều đó mà không thay đổi tập tin nguồn hoặc tạo tùy chỉnh của bạnAppBar
CopsOnRoad

1
@CopsOnRoad Tôi biết, nhưng tôi chỉ chỉ ra những gì OP đang yêu cầu.
Giraldi

43

Bạn có thể sử dụng PreferredSizeflexibleSpacecho nó:

appBar: PreferredSize(
  preferredSize: Size.fromHeight(100.0),
  child: AppBar(
    automaticallyImplyLeading: false, // hides leading widget
    flexibleSpace: SomeWidget(),
  )
),

Bằng cách này bạn có thể giữ elevationcủa AppBarđể giữ cái bóng của nó có thể nhìn thấy và có chiều cao tùy chỉnh, đó là những gì tôi đã chỉ tìm kiếm. Tuy nhiên, bạn phải đặt khoảng cách SomeWidget.


Câu trả lời này nên được chấp nhận! Cảm ơn rât nhiều.
Hazaaa

14

Tại thời điểm viết bài này, tôi không hề hay biết PreferredSize. Câu trả lời của Cinn là tốt hơn để đạt được điều này.

Bạn có thể tạo tiện ích con tùy chỉnh của riêng mình với chiều cao tùy chỉnh:

import "package:flutter/material.dart";

class Page extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Column(children : <Widget>[new CustomAppBar("Custom App Bar"), new Container()],);
  }
}


class CustomAppBar extends StatelessWidget {

  final String title;
  final double barHeight = 50.0; // change this for different heights 

  CustomAppBar(this.title);

  @override
  Widget build(BuildContext context) {
    final double statusbarHeight = MediaQuery
        .of(context)
        .padding
        .top;

    return new Container(
      padding: new EdgeInsets.only(top: statusbarHeight),
      height: statusbarHeight + barHeight,
      child: new Center(
        child: new Text(
          title,
          style: new TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
        ),
      ),
    );
  }
}

9

Ngoài câu trả lời của @ Cinn, bạn có thể xác định một lớp như thế này

class MyAppBar extends AppBar with PreferredSizeWidget {
  @override
  get preferredSize => Size.fromHeight(50);

  MyAppBar({Key key, Widget title}) : super(
    key: key,
    title: title,
    // maybe other AppBar properties
  );
}

hoặc theo cách này

class MyAppBar extends PreferredSize {
  MyAppBar({Key key, Widget title}) : super(
    key: key,
    preferredSize: Size.fromHeight(50),
    child: AppBar(
      title: title,
      // maybe other AppBar properties
    ),
  );
}

và sau đó sử dụng nó thay vì tiêu chuẩn


4

Câu trả lời của Cinn rất tuyệt, nhưng có một điều sai với nó.

Các PreferredSizewidget sẽ bắt đầu ngay lập tức ở phía trên cùng của màn hình, mà không chiếm trên thanh trạng thái, vì vậy một số chiều cao của nó sẽ được lu mờ bởi chiều cao thanh trạng thái của. Điều này cũng giải thích cho các khía cạnh.

Giải pháp : Bao bọc preferredSizeđứa trẻ của bằng mộtSafeArea

appBar: PreferredSize(
  //Here is the preferred height.
  preferredSize: Size.fromHeight(50.0),
  child: SafeArea(
    child: AppBar(
      flexibleSpace: ...
    ),
  ),
),

Nếu bạn không muốn sử dụng thuộc tính flexSpace, thì không cần tất cả những điều đó, vì các thuộc tính khác của AppBarwill tự động chiếm thanh trạng thái.


nhưng SafeArealà để giảm chiều cao thanh trạng thái, nhưng bạn đã thêm lại nó với MediaQuery.of(context).padding.top? Tôi nghĩ rằng SafeArea là không cần thiết ở đây.
Ryde

@Ryde Điều SafeAreaquan trọng để thanh ứng dụng không trùng lặp với thanh trạng thái, nhưng MediaQuery.of(context).padding.topthực tế không cần thiết. Tôi đã chỉnh sửa câu trả lời, cảm ơn.
TN888

-10

Nếu bạn đang ở trong Visual Code, hãy Ctrl + Click vào chức năng AppBar.

Widget demoPage() {
  AppBar appBar = AppBar(
    title: Text('Demo'),
  );
  return Scaffold(
    appBar: appBar,
    body: /*
    page body
    */,
  );
}

Và chỉnh sửa đoạn này.

app_bar.dart will open and you can find 
    preferredSize = new Size.fromHeight(kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),

Sự khác biệt của chiều cao!

hình ảnh mẫu

hình ảnh mẫu


1
Đây không phải là những gì anh ấy yêu cầu. Anh ấy muốn tiêu đề được căn giữa theo chiều dọc
Rémi Rousselet.

centerTitle: true; có thể được sử dụng để làm điều đó.
goops 17

vertical center, không ngang
Rémi Rousselet

Vì vậy, nó không đọc chiều cao mới. Mặc dù vậy, tôi không nghĩ tệp nguồn đang mày mò như app_bar.dart để thay đổi nó sẽ là một ý kiến ​​hay.
goops 17

6
Đó là một ý tưởng rất tồi khi chỉnh sửa các nguồn của một khuôn khổ. Nó sẽ phá vỡ ứng dụng của bạn nếu bạn cập nhật khuôn khổ.
Konstantin
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.