Flutter выровняйте два элемента по крайним точкам - один слева и один справа


95

Я пытаюсь выровнять два элемента на крайних точках: один слева и один справа. У меня есть одна строка, выровненная по левому краю, а затем дочерний элемент этой строки выровнен по правому краю. Однако кажется, что дочерняя строка получает свойство выравнивания от своего родителя. Это мой код

var SettingsRow = new Row(
            mainAxisAlignment: MainAxisAlignment.end,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
                Text("Right",softWrap: true,),
            ],
        );

        var nameRow = new Row(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
                Text("Left"),
                SettingsRow,
            ],
        );

в результате я получаю что-то вроде этого

Left Right

Я бы хотел

Left      Right

Также в строке достаточно места. У меня вопрос: почему дочерняя строка не показывает свое MainAxisAlignment.endсвойство?

Ответы:


195

RowВместо этого используйте сингл с mainAxisAlignment: MainAxisAlignment.spaceBetween.

new Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: [
    new Text("left"),
    new Text("right")
  ]
);

Или вы можете использовать Expanded

new Row(
  children: [
    new Text("left"),
    new Expanded(
      child: settingsRow,
    ),
  ],
);

2
На 2 - ом примере я использую его settingsRow, который содержитText("right")
Ремигия Русселе

Понимаю. Пропустил эту часть
Гюнтер Цёхбауэр

Спасибо. Но из любопытства, почему мой код не работает? mainAxisAlignmentРебенок не происходит. Обгоняют ли свойства родителей свойства детей?
MistyD

1
Второй вариант намного лучше.
Рагху Мудем

1
@KPradeepKumarReddy Если вы не боитесь, что эти два виджета могут перекрывать друг друга, если их размеры слишком велики, я предлагаю использовать Stack, а затем двух дочерних элементов, завернутых в виджеты Align (один с Alignment.center, другой с Alignment.centerRight). Или создайте три расширенных виджета в строке с помощью flex: 1. Первый будет содержать пустой (SizedBox), второй - ваш центрированный виджет (заключенный в центр), а третий - ваш выровненный по правому краю виджет.
Алексей Семенюк

71

Простым решением было бы использовать Spacer()между двумя виджетами

Row(
  children: [
    Text("left"),
    Spacer(),
    Text("right")
  ]
);

Что делает Spacer ()? В ряду я хочу, чтобы один виджет находился в центре, а другой - в крайнем правом углу. Возможно ли это с помощью spacer ()?
К. Прадип Кумар Редди,

51

Вы можете сделать это разными способами.

С помощью mainAxisAlignment: MainAxisAlignment.spaceBetween

Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetween,
  children: <Widget>[
    FlutterLogo(),
    FlutterLogo(),
  ],
);

С помощью Spacer

Row(
  children: <Widget>[
    FlutterLogo(),
    Spacer(),
    FlutterLogo(),
  ],
);

С помощью Expanded

Row(
  children: <Widget>[
    FlutterLogo(),
    Expanded(child: SizedBox()),
    FlutterLogo(),
  ],
);

С помощью Flexible

Row(
  children: <Widget>[
    FlutterLogo(),
    Flexible(fit: FlexFit.tight, child: SizedBox()),
    FlutterLogo(),
  ],
);

Выход :

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


Я хочу, чтобы один виджет был в центре, а другой - в крайнем правом углу. Как мы можем этого добиться?
К. Прадип Кумар Редди,

@KPradeepKumarReddy В этом случае можно использовать хороший подход Stack.
CopsOnRoad,

@KPradeepKumarReddy Я уверен, что на SO уже должен быть такой вопрос, все, что вам нужно сделать, это поиск с правильным ключевым словом. Я не могу показать вам код здесь в комментарии, но идея состоит в том, чтобы использовать Stack, когда его первый дочерний Alignэлемент (справа), а второй может быть Centerили простым Align.
CopsOnRoad,

1

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

Stack(
    children: [
      Align(
        alignment: Alignment.centerRight,
        child: Text("right"),
      ),
      Align(
        alignment: Alignment.center,
        child: Text("center"),
      )
    ],
  )
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.