Flutter: Menyetel ketinggian AppBar

110

Bagaimana cara menyetel ketinggian AppBarin Flutter?

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

Buğra Ekuklu
sumber
@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: // ...
      )
    );
  }
}
Cinn
sumber
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.

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

Pavel
sumber
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.

TN888
sumber
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.

Sami Belaid
sumber
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'),
      ],
    ),
  ),
)
CopsOnRoad
sumber
-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

goops17
sumber
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