Как центрировать заголовок панели приложений

121

Я пытаюсь центрировать текст заголовка на панели приложения, которая имеет как ведущие, так и конечные действия.

@override
Widget build(BuildContext context) {
  final menuButton = new PopupMenuButton<int>(
    onSelected: (int i) {},
    itemBuilder: (BuildContext ctx) {},
    child: new Icon(
      Icons.dashboard,
    ),
  );

  return new Scaffold(
    appBar: new AppBar(
      // Here we take the value from the MyHomePage object that
      // was created by the App.build method, and use it to set
      // our appbar title.
      title: new Text(widget.title, textAlign: TextAlign.center),
      leading: new IconButton(
          icon: new Icon(Icons.accessibility),
          onPressed: () {},
      ),
      actions: [
        menuButton,
      ],
    ),
    body: new Center(
      child: new Text(
        'Button tapped $_counter time${ _counter == 1 ? '' : 's' }.',
      ),
    ),
    floatingActionButton: new FloatingActionButton(
      onPressed: _incrementCounter,
      tooltip: 'Increment',
      child: new Icon(Icons.add),
    ), // This trailing comma makes auto-formatting nicer for build methods.
  );
}

Это работает хорошо, за исключением того, что заголовок выровнен по левому краю, как показано на этом рисунке:

НАЗВАНИЕ СЛЕВА

Когда я пытаюсь включить заголовок в центр, мне кажется, что он слишком левый:

@override
Widget build(BuildContext context) {
  final menuButton = new PopupMenuButton<int>(
    onSelected: (int i) {},
    itemBuilder: (BuildContext ctx) {},
    child: new Icon(
      Icons.dashboard,
    ),
  );

  return new Scaffold(
    appBar: new AppBar(
      // Here we take the value from the MyHomePage object that
      // was created by the App.build method, and use it to set
      // our appbar title.
      title: new Center(child: new Text(widget.title, textAlign: TextAlign.center)),
      leading: new IconButton(
          icon: new Icon(Icons.accessibility),
          onPressed: () {},
      ),
      actions: [
        menuButton,
      ],
    ),
    body: new Center(
      child: new Text(
        'Button tapped $_counter time${ _counter == 1 ? '' : 's' }.',
      ),
    ),
    floatingActionButton: new FloatingActionButton(
      onPressed: _incrementCounter,
      tooltip: 'Increment',
      child: new Icon(Icons.add),
    ), // This trailing comma makes auto-formatting nicer for build methods.
  );
}

НАЗВАНИЕ НЕ ХОРОШО В ЦЕНТРЕ

Мне бы хотелось, чтобы текст заголовка был идеально центрирован между двумя значками.

Христианин
источник

Ответы:

335

Центрирование заголовка по умолчанию в iOS. На Android AppBarзаголовок по умолчанию выровнен по левому краю, но вы можете переопределить его, передав centerTitle: trueв качестве аргумента AppBarконструктору.

Пример:

AppBar(
  centerTitle: true, // this is all you need
  ...
)
Коллин Джексон
источник
6
в этом случае заголовок появляется не совсем по центру: /
Для меня это даже не влияет на выравнивание заголовка.
Майкл Толсма
14

У меня была та же проблема, и она наконец сработала, когда я добавил
mainAxisSize: MainAxisSize.min в свой виджет Row. Надеюсь, это поможет!

 return new Scaffold(
      appBar: new AppBar(
        // Here we take the value from the MyHomePage object that
        // was created by the App.build method, and use it to set
        // our appbar title.
        title: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text(
              widget.title,
            ),
          ],
        ),

        leading: new IconButton(
          icon: new Icon(Icons.accessibility),
          onPressed: () {},
        ),
        actions: [
          menuButton,
        ],
      ),
    );
  }
Annalaufey
источник
11

В моем случае я хотел иметь логотип / изображение по центру вместо текста. В этом случае centerTitleэтого недостаточно (не знаю, почему, у меня есть файл svg, возможно, это причина ...), поэтому, например, это:

appBar: AppBar(centerTitle: true, title: AppImages.logoSvg)

не будет на самом деле центрировать изображение (плюс изображение может быть слишком большим и т. д.). Что мне нравится, так это такой код:

appBar: AppBar(centerTitle: true,
    title: ConstrainedBox(
        constraints: BoxConstraints(maxHeight: 35, maxWidth: 200),
        child: AppImages.logoSvg)),
Саймон Мурье
источник
Принятый ответ работает для текста, но это правильный ответ для пользовательских виджетов. Благодарность!
sfratini
Сработало у меня! Кажется, что centerTitle не работает должным образом, когда на панели инструментов есть действия. Этот исправил это.
Моти Бартов
Не имеет для меня никакого другого эффекта, кроме более простого решения. В моем случае прозрачная граница вокруг изображения приводит к неправильному размещению. Простое обрезание изображения сделало простое решение работоспособным.
rgisi
8

Вот как я делаю centerTitle на панели приложений:

@override
Widget build(BuildContext context) {
return Scaffold(
  appBar: new AppBar(
    centerTitle: true ,
    title: new Text("Login"),
  ),
  body: new Container(
    padding: EdgeInsets.all(18.0),
      key: formkey,
        child: ListView(
        children: buildInputs() + buildSubmitButton(),
      ),
   ) 
);
}
Вильдан Пратама
источник
2

Попробовав множество решений, это помогло мне centerTitle: true добавить образец кода в дополнение к @Collin Jackson ответ

пример вbuild(BuildContext context)

сделай это

appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),centerTitle: true
      ),
Способный ученик
источник
1
Прошло какое-то время, это решило проблему. Очень простой. Спасибо.
Равимаран
2

Вот другой подход, если вы хотите создать собственный заголовок панели приложения. Например, вам нужно изображение и текст в центре панели приложения, затем добавьте

appBar: AppBar(
          title: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Icon(
                Icons.your_app_icon,
                color: Colors.green[500],
              ),
              Container(
                  padding: const EdgeInsets.all(8.0), child: Text('YourAppTitle'))
            ],

          ),
  )

Здесь мы создали Rowс MainAxisAlignment.centerдо центра детей. Затем мы добавили двух дочерних элементов - значок и объект Containerс текстом. Я обернул Textвиджет в, Containerчтобы добавить необходимые отступы.

Аннш Сингх
источник
1
@override
Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            title: Text('Title'),
            actions: <Widget> [
               IconButton(icon: const Icon(Icons.file_upload), onPressed: _pressed),
            ],
            leading: IconButton(icon: const Icon(Icons.list), onPressed: _pressed),
            centerTitle: true,
        )
        body: Text("Content"),
    );
}
Саман Миссагиан
источник
0

Это может помочь сделать текст заголовка панели приложений в центре. Вы можете добавить желаемые стили с помощью стиля или прокомментировать его, если в этом нет необходимости.

appBar: AppBar(
          title:  const Center(
            child: Text(
              "App Title",
              style: TextStyle( color: Colors.white,fontSize: 20),
            ),
          ),
        ),

На дисплее приложения:

введите описание изображения здесь

Рахул Шеканд
источник
0

Вы можете центрировать заголовок панели приложений с помощью centerTitle параметра .

centerTitle - это логический тип данных, а значение по умолчанию - False.

centerTitle : true

Пример :

import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('App Title'),
          backgroundColor: Colors.red,
          centerTitle: true,
        ),
      ),
    ),
  );
}

введите описание изображения здесь

Кранти
источник
0

панель приложений: AppBar (centerTitle: true, title: Text ("HELLO"))

Мусфик Шанта
источник
-3

Использовать Centerобъект

    appBar: AppBar(
      title: Center(
        child: const Text('Title Centered')
      )
    )
Андрей Тодорут
источник
Это не работает, потому что так не должно быть.
Даниал Ахмад,
-4
appBar: AppBar(
    mainAxisAlignment: MainAxisAlignment.center,
)
Issa
источник