200 votes

Flutter aligne deux éléments aux extrêmes - un à gauche et un à droite

J'essaie d'aligner deux éléments aux extrémités, l'un à gauche et l'autre à droite. J'ai une ligne qui est alignée à gauche et un enfant de cette ligne est aligné à droite. Cependant, il semble que la ligne enfant reprenne la propriété d'alignement de son parent. Voici mon code

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

En conséquence, j'obtiens quelque chose comme ceci

Left Right

Ce que je voudrais, c'est

Left      Right

Il y a également suffisamment d'espace sur la rangée. Ma question est la suivante : pourquoi la rangée enfant n'affiche-t-elle pas son nom ? MainAxisAlignment.end propriété ?

384voto

Rémi Rousselet Points 45139

Utilisez un seul Row à la place, avec mainAxisAlignment: MainAxisAlignment.spaceBetween .

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

Ou vous pouvez utiliser Expanded

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

6 votes

Dans le deuxième exemple, j'utilise son settingsRow qui contient Text("right")

0 votes

Je vois. J'ai raté cette partie.

0 votes

Merci. Mais par curiosité, pourquoi mon code ne fonctionne-t-il pas ? Le site mainAxisAlignment de l'enfant ne se produit pas. Les propriétés des parents prennent-elles le pas sur celles des enfants ?

136voto

Nudge Points 888

Une solution simple serait d'utiliser Spacer() entre les deux widgets

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

0 votes

Que fait Spacer() ? Dans une rangée, je veux garder un widget au centre et un autre à l'extrême droite. Est-ce possible en utilisant spacer() ?

2 votes

Mon commentaire n'est peut-être pas pertinent pour la question, mais la réponse de @Pritish est excellente si vous avez par exemple 4 widgets, et que vous en voulez 3 à gauche, et 1 à droite. L'ajout de Spacer() entre le 3ème et le 4ème widget fait l'affaire.

0 votes

C'est vraiment bien car cela me permet de le faire avec plus de 2 widgets.

99voto

CopsOnRoad Points 4705

Vous pouvez le faire de plusieurs façons.

Utilisation de mainAxisAlignment: MainAxisAlignment.spaceBetween

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

Utilisation de Spacer

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

Utilisation de Expanded

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

Utilisation de Flexible

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

Sortie :

enter image description here

1 votes

Je veux un widget au centre et l'autre à l'extrême droite. Comment faire ?

2 votes

@KPradeepKumarReddy Une bonne approche consiste à utiliser Stack dans ce cas.

0 votes

@KPradeepKumarReddy Je suis sûr qu'il doit déjà y avoir une question comme celle-ci sur SO, tout ce que vous devez faire est de chercher avec le bon mot-clé. Je ne peux pas vraiment vous montrer le code ici en commentaire, mais l'idée est d'utiliser Stack dont le premier enfant est Align (à droite) et le second pourrait être un Center ou simple Align .

13voto

poonam kalra Points 61

Oui CopsOnRoad est juste, par le biais de la pile vous pouvez aligner l'un à droite et l'autre au centre.

Stack(
    children: [
      Align(
        alignment: Alignment.centerRight,
        child: Text("right"),
      ),
      Align(
        alignment: Alignment.center,
        child: Text("center"),
      )
    ],
  )

0 votes

L'alignement par défaut est Alignment.center donc vous pouvez l'omettre dans votre deuxième Align widget.

4voto

Utiliser la ligne de code mainAxisAlignment: MainAxisAlignment.spaceBetween, dans une rangée. Cela permettra aux widgets d'être sur deux extrémités. Cependant, si vous travaillez sur TextField, utilisez plutôt la classe de décoration et les attributs prefix*** et suffix***.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X