Flutter: การตั้งค่าความสูงของ AppBar


111

ฉันจะตั้งค่าความสูงของAppBarFlutter ได้อย่างไร?

ชื่อของแถบควรอยู่กึ่งกลางในแนวตั้ง (ในนั้นAppBar)


@ ผู้ชายมันเกี่ยวกับ 'การ' ความสูงAppBarไม่ใช่ 'การตั้งค่า' มัน
Buğra Ekuklu

1
คุณได้ดูสิ่งนี้หรือไม่? คุณยังสามารถสร้างวิดเจ็ตของคุณเองเป็น AppBar และตั้งค่าความสูงได้
Bostrot

@ Leviathlon ของฉันไม่ดี ตรวจสอบคำตอบของฉันสำหรับ (หวังว่า) จะช่วยได้ดีขึ้น
Mans

คำตอบ:


210

คุณสามารถใช้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
ซึ่งจะเพิ่มขนาดของ AppBar แต่ไม่ได้อยู่ตรงกลางของข้อความ
Duncan Jones

5
คุณสามารถใช้centerTitleคุณสมบัติเพื่อจัดกึ่งกลางได้
CopsOnRoad

11
@CopsOnRoad ที่จัดกึ่งกลางแนวนอน แต่ไม่จัดกึ่งกลางในแนวตั้ง
Giraldi

1
@Giraldi คุณไม่สามารถทำได้โดยไม่เปลี่ยนไฟล์ต้นฉบับหรือสร้างแบบกำหนดเองAppBar
CopsOnRoad

1
@CopsOnRoad ฉันรู้ แต่ฉันแค่ชี้ให้เห็นว่า OP กำลังขออะไร
Giraldi

46

คุณสามารถใช้PreferredSizeและflexibleSpaceสำหรับมัน:

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

วิธีนี้คุณสามารถเก็บelevationของAppBarสำหรับการรักษาเงาที่มองเห็นและมีความสูงที่กำหนดเองซึ่งเป็นสิ่งที่ฉันเป็นเพียงการมองหา คุณต้องกำหนดระยะห่างในSomeWidgetแม้ว่า


คำตอบนี้ควรได้รับการยอมรับ! ขอบคุณมาก.
Hazaaa

14

PreferredSizeในขณะที่เขียนนี้ผมไม่ได้ตระหนักถึง คำตอบของ Cinn ดีกว่าที่จะบรรลุสิ่งนี้

คุณสามารถสร้างวิดเจ็ตของคุณเองด้วยความสูงที่กำหนดเอง:

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

10

นอกจากคำตอบของ @ Cinn แล้วคุณสามารถกำหนดคลาสเช่นนี้ได้

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

หรือวิธีนี้

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

แล้วใช้แทนมาตรฐาน


4

คำตอบของ Cinnนั้นยอดเยี่ยม แต่มีสิ่งหนึ่งที่ผิดปกติ

PreferredSizeเครื่องมือที่จะเริ่มต้นได้ทันทีที่ด้านบนของหน้าจอโดยไม่ต้องคิดเป็นแถบสถานะเพื่อให้บางส่วนของความสูงของมันจะถูกเงาโดยความสูงแถบสถานะของ นอกจากนี้ยังอธิบายถึงรอยหยักด้านข้าง

วิธีแก้ปัญหา : ห่อตัวpreferredSizeเด็กด้วยSafeArea

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

หากคุณไม่ต้องการใช้คุณสมบัติ flexibleSpace คุณก็ไม่จำเป็นต้องทำสิ่งนั้นทั้งหมดเพราะคุณสมบัติอื่น ๆ ของAppBarจะพิจารณาแถบสถานะโดยอัตโนมัติ


แต่SafeAreaเป็นการลดความสูงของแถบสถานะ แต่คุณเพิ่มอีกครั้งด้วยMediaQuery.of(context).padding.topหรือไม่? ฉันคิดว่าที่นี่ไม่จำเป็นต้องใช้ SafeArea
Ryde

@Ryde SafeAreaเป็นสิ่งสำคัญเพื่อให้แถบแอปไม่ทับซ้อนกับแถบสถานะ แต่MediaQuery.of(context).padding.topไม่จำเป็นจริงๆ ฉันแก้ไขคำตอบแล้วขอบคุณ
TN888

1

คุณสามารถใช้ toolbarHeight คุณสมบัติของ Appbar มันทำในสิ่งที่คุณต้องการ


1

ใช้toolbarHeight:

ใส่คำอธิบายภาพที่นี่


PreferredSizeไม่มีความจำเป็นต้องไปใช้งานที่ ใช้toolbarHeightกับflexibleSpace.

AppBar(
  toolbarHeight: 120, // Set this height
  flexibleSpace: Container(
    color: Colors.orange,
    child: Column(
      children: [
        Text('1'),
        Text('2'),
        Text('3'),
        Text('4'),
      ],
    ),
  ),
)

-10

หากคุณอยู่ใน Visual Code ให้Ctrl + คลิกที่ฟังก์ชัน AppBar

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

และแก้ไขชิ้นนี้.

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

ความสูงต่างกัน!

ภาพตัวอย่าง

ภาพตัวอย่าง


1
นี่ไม่ใช่สิ่งที่เขาขอ เขาต้องการให้ชื่ออยู่ตรงกลางในแนวตั้ง
Rémi Rousselet

centerTitle: จริง; สามารถนำไปใช้ทำ
goops17

ศูนย์กลางแนวตั้งไม่ใช่แนวนอน
Rémi Rousselet

มันจึงไม่อ่านความสูงใหม่ ฉันไม่คิดว่าการซ่อมแซมไฟล์ต้นฉบับเช่น app_bar.dart สำหรับการเปลี่ยนมันจะเป็นความคิดที่ดี
goops17

6
เป็นความคิดที่แย่มากที่จะแก้ไขแหล่งที่มาของกรอบงาน มันจะทำลายแอปของคุณหากคุณอัปเดตกรอบงาน
Konstantin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.