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.

Mohit Suthar
la source
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(...),
)
Rémi Rousselet
la source
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'),
  ),
),
Günter Zöchbauer
la source
26
Container(
  width: double.infinity,
  child: RaisedButton(...),
),
Vinoth Kumar
la source
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

maheshmnj
la source
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,
                ),
              ],
            ),
Mohit Suthar
la source
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,
          ),
        ),
Hetal
la source
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 .

TejaDroid
la source
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,
...
lapin
la source
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(...)
)
CopsOnRoad
la source
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: () {}))
rinkesh
la source
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.
PaulDef515
la source
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"),
              ),
     ), 
Kelvincer
la source
1

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

ListTile(
  title: new RaisedButton(...),
),
Oush
la source
1

vous pouvez le faire avec MaterialButton

MaterialButton(
     padding: EdgeInsets.all(12.0),
     minWidth: double.infinity,
     onPressed: () {},
    child: Text("Btn"),
)
Mahmoud Abu Elheja
la source
0
 new SizedBox(
  width: 100.0,
     child: new RaisedButton(...),
)
Raj008
la source
0

Celui-ci a fonctionné pour moi

width: MediaQuery.of(context).size.width-100,
kapsid
la source
0

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

TaoZang
la source
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"),

    )
)
Tajul Asri
la source
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.

Adam Smaka
la source
0

Placez votre RaisedButton(...)dans unSizedBox

SizedBox(
  width: double.infinity,
  child: RaisedButton(...),
)
Homme bon
la source