Ancho del botón Coincidir con el padre


120

Quiero saber cómo puedo establecer un ancho para que coincida con el ancho del diseño principal

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

Sé un poco sobre el Expandedwidget, pero Expandedamplía la vista en ambas direcciones, no sé cómo hacerlo.


1
¿Quizás una columna en su lugar?
Günter Zöchbauer

Sí, adjunto una columna en lugar de un contenedor, pero el ancho del botón es Envolver contenido, ¿cómo se puede estirar el ancho al padre
Mohit Suthar

Simplemente puede usar un FlatButton y envolverlo dentro de un contenedor y agregar el ancho del contenedor al ancho de la pantalla usando mediaquery busque mi respuesta a continuación
maheshmnj

Respuestas:


264

La solución correcta sería usar el SizedBox.expandwidget, que lo obliga childa coincidir con el tamaño de su padre.

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

Existen muchas alternativas, lo que permite más o menos personalización:

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

o usando un ConstrainedBox

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

31
SizedBox.expand hará que el botón tome el ancho y el alto completos, lo cual no es la cuestión. La pregunta es sobre un botón que cubre todo el ancho, no la altura.
Vinoth Kumar

3
El comentario de @ RémiRousselet Vinoth es válido. Dado que esta es ahora la respuesta aceptada, ¿podría agregar los constructores correctos para SizedBox para expandir específicamente solo el ancho?
user823447

Recibo este errorFailed assertion: line 1645 pos 12: '!_debugDoingThisLayout': is not true.
kapsid

Gracias por la solución
Ajay Kumar

Me encanta la respuesta bidireccional, es más completa.
Raiden Core

30

El atributo de tamaño se puede proporcionar ButtonThemeconminWidth: double.infinity

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

o después de https://github.com/flutter/flutter/pull/19416 aterrizó

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


24

La forma más sencilla es utilizar un FlatButtonenvuelto dentro de un Container. El botón por defecto toma el tamaño de su padre y así asigna un ancho deseado al 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,
                      ),
                    ),
                  ),
                )

Salida:

ingrese la descripción de la imagen aquí


17

Después de investigar un poco, encontré una solución y, gracias a @ Günter Zöchbauer,

Usé columna en lugar de contenedor y

establezca la propiedad en la columna CrossAxisAlignment.stretch para Fill match parent of 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/ Rowno debería usarse para el diseño de un solo hijo. En su lugar, utilice la alternativa de un solo hijo. Tales como Align, SizedBoxy similares.
Rémi Rousselet

5

Puede establecer la coincidencia de padre del widget por

1) establezca el ancho en 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) Utilice 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,

Encontré una de las mejores soluciones para hacer coincidir el padre con el ancho y la altura como se muestra a continuación

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")),
        ), 

Aquí puede comprobar que el Expandedcontrolador adquiere el ancho y la altura del resto .


1
Hasta ahora es la mejor solución
M David

4

Esto funcionó para mí.

La forma más sencilla de dar ancho o alto al padre coincidente en el código dado arriba.

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

4

Porque match_parentpuedes usar

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

Para cualquier valor en particular puede utilizar

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

1

El siguiente código funciona para mí

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

1

Esto me funciona en un widget autónomo.

  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

Esto es trabajo para mí.

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

1

El uso de a ListTiletambién funciona, ya que una lista ocupa todo el ancho:

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

1

puedes hacerlo con MaterialButton

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

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

0

Este funcionó para mi

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

0

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) Esto funciona para mi.


0

El enfoque más básico es usar Container definiendo su ancho en infinito. Vea el siguiente ejemplo de código

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

Algo como esto funciona para mí.


0

Coloque su RaisedButton(...)en unSizedBox

SizedBox(
  width: double.infinity,
  child: RaisedButton(...),
)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.