Флаттер вирівнює два предмети за крайніми місцями - один зліва та другий справа


96

Я намагаюся вирівняти два елементи в крайніх випадках, один зліва та один справа. У мене є один рядок, який вирівняний ліворуч, а потім дочірній бік цього рядка вирівняний праворуч. Однак, схоже, дочірній рядок забирає властивість вирівнювання у свого батька. Це мій код

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майно?

Відповіді:


197

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
На другому прикладі я використовую його 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 ()?
K Pradeep Kumar Reddy

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(),
  ],
);

Вихід :

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


Я хочу один віджет в центрі, а інший вкрай праворуч. Як ми можемо цього досягти?
K Pradeep Kumar Reddy

@KPradeepKumarReddy Хорошим підходом є використання Stackв такому випадку.
CopsOnRoad

@KPradeepKumarReddy Я впевнений, що вже має бути таке запитання щодо SO, все, що вам потрібно зробити, це пошук за правильним ключовим словом. Насправді я не можу показати вам код у коментарі, але ідея полягає у використанні Stack, причому його перша дитина Align(справа), а друга може бути a 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.