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.