265 votes

Comment définir la largeur et la hauteur d'un bouton dans Flutter ?

J'ai vu que je ne peux pas définir la largeur d'un ElevatedButton en Flutter. Si j'ai bien compris, je devrais mettre le ElevatedButton dans un SizedBox. Je pourrai alors définir la largeur ou la hauteur de la boîte. Est-ce correct? Y a-t-il un autre moyen de le faire?

C'est un peu fastidieux de créer un SizedBox autour de chaque bouton, donc je me demande pourquoi ils ont choisi de faire de cette façon. Je suis sûr qu'ils ont une bonne raison de le faire mais je ne la vois pas. La structure est assez difficile à lire et à construire pour un débutant.

new SizedBox(
  width: 200.0,
  height: 100.0,
  child: ElevatedButton(
    child: Text('Blabla blablablablablablabla bla bla bla'),
    onPressed: _onButtonPressed,
  ),
),

2 votes

3 votes

Veuillez noter qu'un design UI avec des largeurs fixes peut vous donner des maux de tête si vous décidez un jour de rendre votre application accessible (offrir des tailles de police plus grandes) ou multilingue (certains langues sont plus verbeuses que d'autres).

0 votes

306voto

Pavel Ismailov Points 49

Comme indiqué dans la documentation ici

Les boutons surélevés ont une taille minimum de 88.0 par 36.0 qui peut être remplacée avec ButtonTheme.

Vous pouvez le faire de cette manière

ButtonTheme(
  minWidth: 200.0,
  height: 100.0,
  child: RaisedButton(
    onPressed: () {},
    child: Text("test"),
  ),
);

14 votes

Y a-t-il quelque chose comme "match_parent" ??

5 votes

Vous pourriez utiliser width: MediaQuery.of(context).size.width ou width: double.infinity

5 votes

Il suffit de l'envelopper dans un widget Expanded

245voto

CopsOnRoad Points 4705

match_parent (Plein largeur):

SizedBox(
  width: double.infinity, // <-- match_parent
  height: double.infinity, // <-- match-parent
  child: ElevatedButton(...)
)

ou

SizedBox.expand(
  child: ElevatedButton(...)
) 

Largeur spécifique:

SizedBox(
  width: 100, // <-- Votre largeur
  height: 50, // <-- Votre hauteur
  child: ElevatedButton(...)
)

0 votes

Solution intéressante. Je suppose que nous devrions alors utiliser une marge pour laisser de l'espace vide sur les côtés.

0 votes

Dans ce cas, vous devriez utiliser Container au lieu de SizedBox

1 votes

@CopsOnRoad SizedBox crée une boîte de taille fixe. Contrairement au widget Container, SizedBox n'a pas de paramètres de couleur ou de décoration. Donc, si vous avez seulement besoin de définir la largeur, dans ce cas, SizedBox est plus clair. Vous pouvez également consulter cette réponse pour en savoir plus stackoverflow.com/questions/55716322

26voto

Rémi Rousselet Points 45139

C'est parce que Flutter ne concerne pas la taille. Il s'agit des contraintes.

En général, nous avons 2 cas d'utilisation :

  • L'enfant d'un widget définit une contrainte. La taille parentale elle-même est basée sur cette information. ex: Padding, qui prend la contrainte de l'enfant et l'augmente.
  • Le parent impose une contrainte à son enfant. ex: SizedBox, mais aussi Column en mode étirement, ...

RaisedButton est le premier cas. Cela signifie que le bouton définit sa propre hauteur/largeur. Et, selon les règles matérielles, la taille du bouton relevé est fixe.

Si vous ne voulez pas ce comportement, vous pouvez donc utiliser un widget du deuxième type pour remplacer les contraintes du bouton.


Quoi qu'il en soit, si vous avez besoin de cela souvent, envisagez de créer un nouveau widget qui fait le travail pour vous. Ou utilisez MaterialButton, qui possède une propriété de hauteur.

0 votes

Où puis-je lire toutes les règles matérielles pour voir quand le cas 1 s'applique et quand le cas 2 s'applique ?

22voto

hui00 Points 497

Je recommanderais d'utiliser un MaterialButton, que vous pouvez faire comme ceci :

MaterialButton( 
 height: 40.0, 
 minWidth: 70.0, 
 color: Theme.of(context).primaryColor, 
 textColor: Colors.white, 
 child: new Text("push"), 
 onPressed: () => {}, 
 splashColor: Colors.redAccent,
)

1 votes

En utilisant minWidth ne répond pas pleinement à la question de définir la largeur. Utiliser un widget parent Wrap pourrait être utile ici.

0 votes

C'est parfait pour obtenir des boutons plus petits qui enveloppent étroitement leurs étiquettes.

0 votes

La hauteur reste énorme avec ceci, même avec la plus petite police

5voto

Fayaz Points 74

Ce morceau de code vous aidera à mieux résoudre votre problème, car nous ne pouvons pas spécifier la largeur directement au RaisedButton, nous pouvons spécifier la largeur à son enfant

double largeur = MediaQuery.of(context).size.width;
var enfantMaxLargeur = SizedBox(
            width: largeur,
            child: Text(
              StringConfig.acceptButton,
              textAlign: TextAlign.center,
            ));

RaisedButton(
        child: enfantMaxLargeur,
        onPressed: (){},
        color: Colors.white,
    );

0 votes

Aussi, si vous voulez que votre bouton occupe 80% de l'écran par exemple, vous pouvez width * 0.8

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