Родитель ширины кнопки соответствует: флаттер

Я новичок в Flutter, поэтому я хочу знать, как я могу установить ширину, чтобы соответствовать ширине родительского макета

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

Я немного разбираюсь в теге Expanded, но Expanded расширяет представление в обоих направлениях, я не знаю, как это сделать. Помогите мне, если знаете, заранее спасибо.

27 ответов

Решение

Правильным решением было бы использовать SizedBox.expand виджет, который обеспечивает его child чтобы соответствовать размеру своего родителя.

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

Есть много альтернатив, которые позволяют более или менее настраивать:

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

или используя ConstrainedBox

new ConstrainedBox(
    constraints: const BoxConstraints(minWidth: double.infinity),
    child: new RaisedButton(...),
)
    new Container {
         width: double.infinity,
         child: new RaisedButton(...),
    }

После некоторых исследований я нашел какое-то решение, и благодаря @Günter Zöchbauer,

Я использовал столбец вместо контейнера и

установите свойство в столбец CrossAxisAlignment.stretch, чтобы заполнить совпадение родительского элемента 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,
                ),
              ],
            ),

Ограничение размера может быть обеспечено с помощью ButtonTheme с minWidth: double.infinity

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

или после приземления https://github.com/flutter/flutter/pull/19416

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

Самый простой способ - использовать FlatButton, обернутый внутри контейнера. Кнопка по умолчанию принимает размер своего родителя и назначает контейнеру желаемую ширину.

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

приведенный выше виджет производит следующий вывод

h tt ps://stackru.com/images/c78c78dc2aa3cb3b14974ef562b267aa41f99c66.png

Вы можете установить соответствующий родительский элемент виджета с помощью

1) установите ширину на 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) Используйте 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,
          ),
        ),

За match_parent вы можете использовать

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

Для любого конкретного значения вы можете использовать

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

@ Мохит Сутар,

Нашел одно из лучших решений для соответствия родителя ширине и высоте, как показано ниже

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

Здесь вы можете проверить, что Expanded Контроллер приобретает всю оставшуюся ширину и высоту.

Есть много способов сделать кнопку полной ширины. Но я думаю, вы должны понимать концепцию создания виджетов полной ширины в разных сценариях:

Когда вы используете вложенные виджеты, трудно определить ширину родительского виджета. Просто вы не можете указать ширину во вложенных виджетах. Поэтому вы должны использовать либо Expanded, либо Column с CrossAxisAlignment как Strech.

В других случаях вы можете использовать ширину медиа-запроса или double.infinity.

Вот несколько примеров вложенных виджетов и одного виджета:

Первый:

      Expanded(   // This will work for nested widgets and will take width of first parent widget.
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

Второй:

      Column( // This will not work if parent widget Row.
  crossAxisAlignment: CrossAxisAlignment.stretch,
  children: <Widget>[
    MaterialButton(
      onPressed: () {},
      child: const Text("Button Text"),
      color: Colors.indigo,
      textColor: Colors.white,
    )
  ]
)

В третьих:

      ButtonTheme( // if use media query, then will not work for nested widgets.
  minWidth: double.infinity,  //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

Четвертый:

      SizedBox( // if use media query, then will not work for nested widgets.
  width: double.infinity, //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

Пятый:

      Container( // if use media query, then will not work for nested widgets.
  width: double.infinity, //Or use 'width: MediaQuery.of(context).size.width'
  child: MaterialButton(
    onPressed: () {},
    child: const Text("Button Text"),
    color: Colors.indigo,
    textColor: Colors.white,
  )
)

С моей точки зрения, рекомендуемый будет Первый. Также вы можете изменить MaterialButton к ElevatedButton или TextButton или RaisedButton (Depreciated) или любой другой виджет.

Ваше здоровье!

Это сработало для меня.

Самый простой способ дать ширину или высоту соответствия родителю в приведенном выше коде.

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

Разместите свой RaisedButton(...) в SizedBox

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

Вы можете установить fixedSize.width принадлежащий ButtonStyle к очень большому количеству, например double.maxFinite. Вы также можете использовать Size.fromWidth() конструктор, если вы не хотите указывать высоту:

      ElevatedButton(
  child: const Text('Button'),
  style: ElevatedButton.styleFrom(
    fixedSize: const Size.fromWidth(double.maxFinite),
  ),
),

Живая демонстрация

Вы можете сделать это с помощью MaterialButton

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

Самый простой подход - использовать контейнер, задав его ширину до бесконечности. См. Ниже пример кода

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

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

Что-то вроде этого у меня работает.

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

В Flutter 2.0 RaisedButton устарел и заменен на.

minimumSize собственностью ElevatedButton виджет именно это и делает.

Пример кода:

      ElevatedButton(
            style: ElevatedButton.styleFrom(
              primary: Colors.green,
              onPrimary: Colors.white,
              shadowColor: Colors.greenAccent,
              elevation: 3,
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(20.0)),
              minimumSize: Size(100, 40), //////// HERE
            ),
            onPressed: () {},
            child: Text('MyButton'),
          )

Это работает для меня.

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

RaisedButton( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [Text('Submit')], ) ) Меня устраивает.

Это работает для меня в автономном виджете.

  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.

Следующий код работает для меня

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

Использование ListTile также работает, так как список заполняет всю ширину:

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

используйте этот фрагмент кода

      width: Size.infinite.width

Оберните ваш (дочерний виджет фиксированной ширины) центральным виджетом. Это будет центрировать ваш виджет:

      Center(child:Container(width:250,child:TextButton(child:Text("Button Name),),)

Это сработало для меня

width: MediaQuery.of(context).size.width-100,
      TextButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.blue),
                fixedSize: MaterialStateProperty.all(
                  Size(double.maxFinite, 50.0),
                ),
              ),
              onPressed: () {},
              child: Text('Upgrade to Premium'),
            ),

ПЫТАТЬСЯ

      Flexible(
 child: Row(
  children: [
    ElevatedButton(
     onPressed: () {},
     child: Text("love you}"),
   ),
  ],
 ),
),
Другие вопросы по тегам