Flutter: Menyetel ketinggian AppBar


110

Bagaimana cara menyetel ketinggian AppBarin Flutter?

Judul bilah harus tetap berada di tengah secara vertikal (di situ AppBar).


@Man Ini tentang 'mendapatkan' ketinggian AppBar, bukan 'mengatur' itu.
Buğra Ekuklu

1
Apakah Anda sudah melihat ini ? Anda juga dapat membuat widget Anda sendiri sebagai AppBar dan mengatur tingginya.
Bostrot

@Levilon saya buruk. periksa jawaban saya untuk (semoga) bantuan yang lebih baik
Mans

Jawaban:


208

Anda dapat menggunakan 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
Ini meningkatkan ukuran AppBar, tetapi tidak memusatkan teks.
Duncan Jones

5
Anda dapat menggunakan centerTitleproperti untuk memusatkannya.
CopsOnRoad

11
@CopsOnRoad Itu memusatkannya secara horizontal tetapi tidak memusatkannya secara vertikal.
Giraldi

1
@Giraldi Anda tidak dapat melakukannya tanpa mengubah file sumber atau membuat kustom AndaAppBar
CopsOnRoad

1
@CopsOnRoad Saya tahu, tapi saya baru saja menunjukkan apa yang diminta OP.
Giraldi

46

Anda dapat menggunakan PreferredSizedan flexibleSpaceuntuk itu:

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

Dengan cara ini Anda dapat menjaga elevationdari AppBaruntuk menjaga bayangannya terlihat dan memiliki tinggi adat, yang adalah apa yang saya hanya mencari. Anda memang harus mengatur jaraknya SomeWidget.


Ini harus menjadi jawaban yang diterima! Terima kasih banyak.
Hazaaa

14

Pada saat menulis ini, saya tidak menyadarinya PreferredSize. Jawaban Cinn lebih baik untuk mencapai ini.

Anda dapat membuat widget khusus Anda sendiri dengan ketinggian khusus:

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

Selain jawaban @ Cinn, Anda dapat menentukan kelas seperti ini

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

atau lewat sini

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

dan kemudian gunakan sebagai pengganti standar


4

Jawaban Cinn bagus, tapi ada satu hal yang salah.

The PreferredSizewidget akan segera dimulai di bagian atas layar, tanpa akuntansi untuk status bar, sehingga beberapa dari puncaknya akan dibayangi oleh tingginya status bar. Ini juga menjelaskan takik samping.

Solusinya : Bungkus preferredSizeanak dengan aSafeArea

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

Jika Anda tidak ingin menggunakan properti flexibleSpace, maka tidak diperlukan semua itu, karena properti lain dari AppBarakan memperhitungkan bilah status secara otomatis.


tetapi SafeAreaapakah untuk mengurangi tinggi bilah status, namun Anda menambahkannya lagi dengan MediaQuery.of(context).padding.top? Saya pikir SafeArea tidak diperlukan di sini.
Ryde

@Ryde The SafeAreapenting agar bilah aplikasi tidak tumpang tindih dengan bilah status, tetapi MediaQuery.of(context).padding.topsebenarnya tidak diperlukan. Saya sudah mengedit jawabannya, terima kasih.
TN888

1

Anda dapat menggunakan properti toolbarHeight dari Appbar, ia melakukan apa yang Anda inginkan.


0

Penggunaan toolbarHeight:

masukkan deskripsi gambar di sini


Tidak perlu lagi menggunakan PreferredSize. Gunakan toolbarHeightdengan flexibleSpace.

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

-10

Jika Anda berada dalam Kode Visual, Ctrl + Klik pada fungsi AppBar.

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

Dan edit bagian ini.

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

Perbedaan ketinggian!

contoh gambar

contoh gambar


1
Ini bukan yang dia minta. Dia ingin judulnya berada di tengah secara vertikal
Rémi Rousselet

centerTitle: benar; dapat digunakan untuk melakukannya.
goops17

tengah vertikal, bukan horizontal
Rémi Rousselet

Jadi tidak membaca ketinggian baru. Saya tidak berpikir mengotak-atik file sumber seperti app_bar.dart, untuk mengubahnya, akan menjadi ide yang bagus.
goops17

6
Ide yang sangat buruk untuk pernah mengedit sumber kerangka kerja. Ini akan merusak aplikasi Anda jika Anda memperbarui kerangka kerja.
Konstantin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.