Parent de correspondance de largeur de bouton


120

Je veux savoir comment puis-je définir une largeur correspondant à la largeur de la mise en page parent

new Container(
  width: 200.0,
  padding: const EdgeInsets.only(top: 16.0),
  child: new RaisedButton(
    child: new Text(
        "Submit",
        style: new TextStyle(
          color: Colors.white,
        )
    ),
    colorBrightness: Brightness.dark,
    onPressed: () {
      _loginAttempt(context);
    },
    color: Colors.blue,
  ),
),

Je connais peu de choses sur le Expandedwidget mais Expandedélargit la vue dans les deux sens, je ne sais pas comment le faire.


1
Peut-être une colonne à la place?
Günter Zöchbauer

Oui, j'attache une colonne au lieu de conteneur mais la largeur du bouton est Wrap Content comment peut étirer la largeur au parent
Mohit Suthar

Vous pouvez simplement utiliser un FlatButton et l'envelopper dans un conteneur et ajouter la largeur du conteneur à la largeur de l'écran en utilisant mediaquery chercher ma réponse ci
maheshmnj

Réponses:


264

La solution correcte serait d'utiliser le SizedBox.expandwidget, ce qui oblige childà correspondre à la taille de son parent.

SizedBox.expand(
  child: RaisedButton(...),
)

Il existe de nombreuses alternatives, ce qui permet plus ou moins de personnalisation:

SizedBox(
  width: double.infinity,
  // height: double.infinity,
  child: RaisedButton(...),
)

ou en utilisant un ConstrainedBox

ConstrainedBox(
    constraints: const BoxConstraints(minWidth: double.infinity),
    child: RaisedButton(...),
)

31
SizedBox.expand rendra le bouton pleine largeur et hauteur, ce qui n'est pas la question. La question concerne un bouton couvrant toute la largeur et non la hauteur.
Vinoth Kumar

3
Le commentaire de @ RémiRousselet Vinoth est valide. Puisque c'est maintenant la réponse acceptée, pourriez-vous ajouter les bons constructeurs pour SizedBox pour étendre spécifiquement uniquement la largeur?
user823447

Je reçois cette erreurFailed assertion: line 1645 pos 12: '!_debugDoingThisLayout': is not true.
kapsid

Thnaks pour la solution
Ajay Kumar

J'adore la réponse dans les deux sens, elle est plus complète.
Raiden Core

31

L'attribut size peut être fourni en utilisant ButtonThemeavecminWidth: double.infinity

ButtonTheme(
  minWidth: double.infinity,
  child: MaterialButton(
    onPressed: () {},
    child: Text('Raised Button'),
  ),
),

ou après https://github.com/flutter/flutter/pull/19416 atterri

MaterialButton(
  onPressed: () {},
  child: SizedBox.expand(
    width: double.infinity, 
    child: Text('Raised Button'),
  ),
),


24

Le moyen le plus simple consiste à utiliser un FlatButtonencapsulé à l'intérieur d'un Container, Le bouton par défaut prend la taille de son parent et ainsi attribuer une largeur souhaitée au Container.

            Container(
                  color: Colors.transparent,
                  width: MediaQuery.of(context).size.width,
                  height: 60,
                  child: FlatButton(
                    shape: new RoundedRectangleBorder(
                      borderRadius: new BorderRadius.circular(30.0),
                    ),
                    onPressed: () {},
                    color: Colors.red[300],
                    child: Text(
                      "Button",
                      style: TextStyle(
                        color: Colors.black,
                        fontFamily: 'Raleway',
                        fontSize: 22.0,
                      ),
                    ),
                  ),
                )

Production:

entrez la description de l'image ici


17

Après quelques recherches, j'ai trouvé une solution, et grâce à @ Günter Zöchbauer,

J'ai utilisé la colonne au lieu de Container et

définissez la propriété sur la colonne CrossAxisAlignment.stretch sur Fill match parent de Button

    new Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                new RaisedButton(
                  child: new Text(
                      "Submit",
                      style: new TextStyle(
                        color: Colors.white,
                      )
                  ),
                  colorBrightness: Brightness.dark,
                  onPressed: () {
                    _loginAttempt(context);
                  },
                  color: Colors.blue,
                ),
              ],
            ),

8
Column/ Rowne doit pas être utilisé pour la mise en page à enfant unique. Utilisez plutôt l'alternative à enfant unique. Tels que Align, SizedBoxet similaires.
Rémi Rousselet

5

Vous pouvez définir le parent correspondant du widget en

1) réglez la largeur sur double.infinity :

new Container(
          width: double.infinity,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),

2) Utilisez MediaQuery:

new Container(
          width: MedialQuery.of(context).size.width,
          padding: const EdgeInsets.only(top: 16.0),
          child: new RaisedButton(
            child: new Text(
                "Submit",
                style: new TextStyle(
                  color: Colors.white,
                )
            ),
            colorBrightness: Brightness.dark,
            onPressed: () {
              _loginAttempt(context);
            },
            color: Colors.blue,
          ),
        ),

4

@Mohit Suthar,

Nous avons trouvé l'une des meilleures solutions pour faire correspondre le parent à la largeur et à la hauteur comme ci-dessous

new Expanded(
          child: new Container(
              padding: EdgeInsets.all(16.0),
              margin: EdgeInsets.all(16.0),
              decoration: new BoxDecoration(
                  color: Colors.white,
                  borderRadius:
                      const BorderRadius.all(const Radius.circular(8.0)),
                  border: new Border.all(color: Colors.black, width: 1.0)),
              child: new Text("TejaDroid")),
        ), 

Ici, vous pouvez vérifier que le Expandedcontrôleur acquiert toute la largeur et la hauteur du reste .


1
Jusqu'à présent, c'est la meilleure solution
M David

4

Cela a fonctionné pour moi.

Le moyen le plus simple de donner la largeur ou la hauteur de match-parent dans le code donné ci-dessus.

...
width: double.infinity,
height: double.infinity,
...

4

Car match_parentvous pouvez utiliser

SizedBox(
  width: double.infinity, // match_parent
  child: RaisedButton(...)
)

Pour toute valeur particulière que vous pouvez utiliser

SizedBox(
  width: 100, // specific value
  child: RaisedButton(...)
)

1

Le code suivant fonctionne pour moi

       ButtonTheme(
            minWidth: double.infinity,
            child: RaisedButton(child: Text("Click!!", style: TextStyle(color: Colors.white),), color: Colors.pink, onPressed: () {}))

1

Cela fonctionne pour moi dans un widget autonome.

  Widget signinButton() {
    return ButtonTheme(
      minWidth: double.infinity,
      child: new FlatButton(
        onPressed: () {},
        color: Colors.green[400],
        textColor: Colors.white,
        child: Text('Flat Button'),
      ),
    );
  }

// It can then be used in a class that contains a widget tree.

1

Cela fonctionne pour moi.

    SizedBox(
             width: double.maxFinite,
             child: RaisedButton(
                 materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                 child: new Text("Button 2"),
                 color: Colors.lightBlueAccent,
                 onPressed: () => debugPrint("Button 2"),
              ),
     ), 

1

L'utilisation de a ListTilefonctionne également, car une liste remplit toute la largeur:

ListTile(
  title: new RaisedButton(...),
),

1

vous pouvez le faire avec MaterialButton

MaterialButton(
     padding: EdgeInsets.all(12.0),
     minWidth: double.infinity,
     onPressed: () {},
    child: Text("Btn"),
)

0
 new SizedBox(
  width: 100.0,
     child: new RaisedButton(...),
)

0

Celui-ci a fonctionné pour moi

width: MediaQuery.of(context).size.width-100,

0

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) Ça marche pour moi.


0

L'approche la plus basique consiste à utiliser Container en définissant sa largeur sur l'infini. Voir ci-dessous l'exemple de code

Container(
    width: double.infinity,
    child:FlatButton(
        onPressed: () {
            //your action here
        },
        child: Text("Button"),

    )
)

0
         OutlineButton(
              onPressed: () {
                logInButtonPressed(context);
              },
              child: Container(
                width: MediaQuery.of(context).size.width / 2,
                child: Text(Log in,
                  textAlign: TextAlign.center,
                ),
              ),
            )

Quelque chose comme ça fonctionne pour moi.


0

Placez votre RaisedButton(...)dans unSizedBox

SizedBox(
  width: double.infinity,
  child: RaisedButton(...),
)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.