Flutter: AppBar'ın yüksekliğini ayarlama


105

AppBarFlutter'ın yüksekliğini nasıl basitçe ayarlayabilirim ?

Çubuğun başlığı (bunun içinde AppBar) dikey olarak ortalanmış olarak kalmalıdır .


@Mans Bu AppBar, onu 'ayarlamak' değil , yüksekliğini 'elde etmek' ile ilgili .
Buğra Ekuklu

1
Eğer bir göz attım mü bu ? Ayrıca bir AppBar olarak kendi widget'ınızı oluşturabilir ve yüksekliğini ayarlayabilirsiniz.
Bostrot

@Leviathlon benim hatam. (umarım) daha iyi bir yardım için cevabımı kontrol edin
Mans

Yanıtlar:


197

PreferredSize'ı kullanabilirsiniz :

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
Bu, AppBar'ın boyutunu artırır, ancak metni ortalamaz.
Duncan Jones

5
centerTitleMülkü ortalamak için kullanabilirsiniz .
CopsOnRoad

11
@CopsOnRoad Onu yatay olarak ortalayan, ancak dikey olarak ortalamayan.
Giraldi

1
@Giraldi Kaynak dosyayı değiştirmeden veya kendi AppBar
özelinizi

1
@CopsOnRoad Biliyorum, ama sadece OP'nin ne istediğine işaret ediyordum.
Giraldi

43

Kullanabilirsiniz PreferredSizeve flexibleSpacebunun için:

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

Eğer tutabilir Bu şekilde elevationbir AppBarben aradığı şeyi olduğu özel yükseklik, görünür gölgesini tutmak için ve var. SomeWidgetYine de aralığı ayarlamanız gerekir .


Bu cevap kabul edilmelidir! Çok teşekkür ederim.
Hazaaa

14

Bunu yazarken farkında değildim PreferredSize. Cinn'in cevabı bunu başarmak için daha iyidir.

Özel bir yüksekliğe sahip kendi özel widget'ınızı oluşturabilirsiniz:

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

@ Cinn'in cevabına ek olarak, bunun gibi bir sınıf tanımlayabilirsiniz

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

ya da bu şekilde

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

ve sonra standart olan yerine kullanın


4

Cinn'in cevabı harika, ama yanlış olan bir şey var.

PreferredSizeYüksekliğinin bazı durum çubuğunun yüksekliği gölgesinde edilecek böylece Widget, durum çubuğunda hesaba katmadan, ekranın en üstündeki hemen başlayacaktır. Bu aynı zamanda yan çentikleri de hesaba katar.

Çözüm : preferredSizeÇocuğunu birSafeArea

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

FlexibleSpace özelliğini kullanmak istemiyorsanız, tüm bunlara gerek yoktur çünkü diğer özellikleri AppBardurum çubuğunu otomatik olarak hesaplayacaktır.


ama SafeAreadurum çubuğu yüksekliğini azaltmak, yine de ile yeniden eklediniz MediaQuery.of(context).padding.topmi? Burada SafeArea'ya ihtiyaç olmadığını düşünüyorum.
Ryde

@Ryde SafeArea, uygulama çubuğunun durum çubuğu ile çakışmaması için önemlidir, ancak MediaQuery.of(context).padding.topaslında gerekli değildir. Cevabı düzenledim, teşekkürler.
TN888

-10

Görsel Kod içindeyseniz , Ctrl + AppBar işlevine tıklayın .

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

Ve bu parçayı düzenleyin.

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

Yükseklik farkı!

örnek resim

örnek resim


1
İstediği bu değildi. Başlığın dikey olarak ortalanmasını istiyor
Rémi Rousselet

centerTitle: true; bunu yapmak için kullanılabilir.
goops17

dikey merkez, yatay değil
Rémi Rousselet

Yani yeni yüksekliği okumaz. Yine de değiştirmek için app_bar.dart gibi bir kaynak dosyayı tamir etmenin iyi bir fikir olacağını düşünmüyorum.
goops17

6
Bir çerçevenin kaynaklarını herhangi bir zamanda düzenlemek çok kötü bir fikir. Çerçeveyi güncellerseniz uygulamanızı bozar.
Konstantin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.