Як встановити ширину кнопки RaisedButton у Flutter?


126

Я бачив, що не можу встановити ширину a RaisedButtonу Flutter. Якщо я добре зрозумів, мені слід поставити RaisedButtonсимвол SizedBox. Потім я зможу встановити ширину або висоту коробки. Це правильно? Чи є інший спосіб це зробити?

Це трохи нудно створювати SizedBoxнавколо кожної кнопки, тому мені цікаво, чому вони вирішили зробити це таким чином. Я майже впевнений, що у них є вагома причина для цього, але я цього не бачу. Ліси досить складно читати і будувати для початківців.

new SizedBox(
  width: 200.0,
  height: 100.0,
  child: new RaisedButton(
    child: new Text('Blabla blablablablablablabla bla bla bla'),
    onPressed: _onButtonPressed,
  ),
),

2
Прочитайте це видання: github.com/flutter/flutter/issues/10492
— Бласанка,

3
Зверніть увагу, що дизайн інтерфейсу користувача із фіксованою шириною може доставити вам головний біль, якщо ви коли-небудь вирішите зробити свою програму доступною (пропонуйте більші розміри шрифту) або багатомовною (деякі мови більш багатослівні, ніж інші).
— Рууд Гельдерман,

Відповіді:


240

Як сказано в документації тут

Підняті кнопки мають мінімальний розмір 88,0 на 36,0, який можна замінити кнопкою ButtonTheme.

Ви можете зробити це так

ButtonTheme(
  minWidth: 200.0,
  height: 100.0,
  child: RaisedButton(
    onPressed: () {},
    child: Text("test"),
  ),
);

8
Чи є щось на зразок "match_parent" ??
— Паван,

2
ви могли б скористатися width:MediaQuery.of(context).size.widthабоwidth:double.infinity
— Оуш

2
Просто оберніть його розширеним віджетом
— janosch

2
він вилучає всі базові значення Buttontheme
— Мурат Озбайрактар

101

Для match_parentвас можна використовувати

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

Для будь-якого конкретного значення ви можете використовувати

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

Цікаве рішення. Я думаю, що тоді нам слід використовувати запас, щоб звільнити порожній простір по боках.
— OlivierGrenoble

У такому випадку вам слід використовувати ContainerзамістьSizedBox
— CopsOnRoad

@CopsOnRoad SizedBox створює вікно фіксованого розміру. На відміну від віджета Container, Sized Box не має кольорів та параметрів оздоблення. Отже, якщо вам потрібно лише встановити ширину, у цьому випадку SizedBox стає більш зрозумілим. Ви також можете перевірити цю відповідь, щоб знайти більше stackoverflow.com/questions/55716322
— Хасан Ель-Хефнаві

1
@ HasanEl-Hefnawy Я це знаю, саме тому я використав коробку розміру. Але хтось просив маржі, і я відповів йому рішенням Container
— CopsOnRoad

19

Це тому, що тріпотіння - це не розмір. Йдеться про обмеження.

Зазвичай ми маємо 2 варіанти використання:

  • Дочірній елемент віджету визначає обмеження. Сам батьківський розмір базується на цій інформації. ех:, Paddingякий приймає обмеження для дитини та збільшує його.
  • Батьки застосовують обмеження до своєї дитини. наприклад:, SizedBoxале також Columnу стреч-режимі, ...

RaisedButtonце перший випадок. Що означає, що кнопка визначає власну висоту / ширину. І, згідно з матеріальними правилами, збільшений розмір кнопки зафіксовано.

Ви не хочете такої поведінки, тому ви можете використовувати віджет другого типу, щоб замінити обмеження кнопок.


У будь-якому випадку, якщо вам це багато потрібно, розгляньте можливість створення нового віджета, який виконує цю роботу за вас. Або використання MaterialButton, яке має властивість висоти.


15

я б рекомендував використовувати MaterialButton, ніж ви можете зробити це так:

new MaterialButton( 
 height: 40.0, 
 minWidth: 70.0, 
 color: Theme.of(context).primaryColor, 
 textColor: Colors.white, 
 child: new Text("push"), 
 onPressed: () => {}, 
 splashColor: Colors.redAccent,
)

використання minWidth не повністю відповідає на питання про встановлення ширини. Тут може бути корисним використання батьківського віджета Wrap.
— AlanKley

Це ідеально підходить для отримання менших кнопок, які щільно обмотують свої ярлики.
— hawkbee

6

Вам потрібно використовувати розширений віджет. Але якщо ваша кнопка знаходиться на стовпці, розширений віджет заповнює решту стовпця. Отже, вам потрібно вкласти розширений віджет у рядок.

Row(children: <Widget>[
Expanded(
  flex: 1,
  child: RaisedButton(
    child: Text("Your Text"),
      onPressed: _submitForm,
    ),
  ),),])

"The Expanded You" - ви маєте на увазі розширений віджет?
— Ясір,

Значення flex за замовчуванням дорівнює 1, немає необхідності вказувати його.
— c49

Розширені роботи. дякую
— Sravan

6

Мій найкращий спосіб зробити кнопку "Підняти" з батьківським збігом - обернути її контейнером. нижче - зразок коду.

Container(
          width: double.infinity,
          child: RaisedButton(
                 onPressed: () {},
                 color: Colors.deepPurpleAccent[100],
                 child: Text(
                        "Continue",
                        style: TextStyle(color: Colors.white),
                      ),
                    ),
                  )

5

Цей фрагмент коду допоможе вам краще вирішити вашу проблему, оскільки ми не можемо вказати ширину безпосередньо до RaisedButton, ми можемо вказати ширину для її дочірнього

double width = MediaQuery.of(context).size.width;
var maxWidthChild = SizedBox(
            width: width,
            child: Text(
              StringConfig.acceptButton,
              textAlign: TextAlign.center,
            ));

RaisedButton(
        child: maxWidthChild,
        onPressed: (){},
        color: Colors.white,
    );

також, якщо ви хочете, щоб ваша кнопка становила 80% екрану для прикладу, ви можетеwidth * 0.8
— Кирило Кармазін

5

Просто використовуйте FractionallySizedBox, де widthFactor& heightFactor визначте відсоток розміру програми / батьків.

FractionallySizedBox(
widthFactor: 0.8,   //means 80% of app width
child: RaisedButton(
  onPressed: () {},
  child: Text(
    "Your Text",
    style: TextStyle(color: Colors.white),
  ),
  color: Colors.red,
)),

4

Використовуйте Media Query, щоб розумно використовувати ширину для вашого рішення, яке буде працювати однаково для малого та великого екрану

  Container(
            width: MediaQuery.of(context).size.width * 0.5, // Will take 50% of screen space
            child: RaisedButton(
              child: Text('Go to screen two'),
              onPressed: () => null
            ),
          )

Ви можете застосувати подібне рішення SizeBoxтакож.


3

Якщо ви хочете глобально змінити висоту та мінімальну ширину всіх ваших RaisedButtons, тоді ви можете замінити ThemeDataвсередині вашого MaterialApp:

 @override
  Widget build(BuildContext context) {
    return MaterialApp(
       ...
       theme: ThemeData(
       ...
       buttonTheme: ButtonThemeData(
          height: 46,
          minWidth: 100,
       ),
    ));
  }

3

Загорніть RaisedButton всередину контейнера та надайте ширину віджету контейнера.

напр

 Container(
 width : 200,
 child : RaisedButton(
         child :YourWidget ,
         onPressed(){}
      ),
    )

3

Ви можете створити глобальний метод, наприклад, для кнопки, яка використовується в усьому додатку. Змінюватиметься відповідно до довжини тексту всередині контейнера. Віджет FittedBox використовується, щоб віджет підходив відповідно до дитини всередині нього.

Widget primaryButton(String btnName, {@required Function action}) {
  return FittedBox(
  child: RawMaterialButton(
  fillColor: accentColor,
  splashColor: Colors.black12,
  elevation: 8.0,
  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
  child: Container(
    padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 13.0),
    child: Center(child: Text(btnName, style: TextStyle(fontSize: 18.0))),
  ),
  onPressed: () {
    action();
   },
  ),
 );
}

Якщо вам потрібна кнопка певної ширини та висоти, ви можете використовувати властивість обмеження RawMaterialButton для надання мінімальної максимальної ширини та висоти кнопки

constraints: BoxConstraints(minHeight: 45.0,maxHeight:60.0,minWidth:20.0,maxWidth:150.0),

1

Ви можете зробити так, як кажуть у коментарях, або заощадити зусилля та працювати з RawMaterialButton. у яких є все, і ви можете змінити межу на кругову та безліч інших атрибутів. колишня форма (збільште радіус, щоб мати більш круглу форму)

shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),//ex add 1000 instead of 25

і ви можете використовувати будь-яку потрібну фігуру як кнопку, використовуючи GestureDetector, який є віджетом і приймає інший віджет під атрибутом дочірній. як в іншому прикладі тут

GestureDetector(
onTap: () {//handle the press action here }
child:Container(

              height: 80,
              width: 80,
              child:new Card(

                color: Colors.blue,
                shape: new RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
                elevation: 0.0,                
              child: Icon(Icons.add,color: Colors.white,),
              ),
              )
)

1

Якщо кнопка розміщена у Flexвіджеті (включаючи Row& Column), ви можете обернути її за допомогою розширеного віджета, щоб заповнити вільний простір.


2
Розширене може працювати, лише якщо батьки підтримують його.
— CopsOnRoad

Expandedпередбачається використовувати у віджетах для багатьох дітей, таких як Rowі Column.
— Loolooii

0

У моєму випадку я використав поле, щоб мати змогу змінити розмір:

Container(


     margin: EdgeInsets.all(10),

    // or margin: EdgeInsets.only(left:10, right:10),



        child: RaisedButton(
          padding: EdgeInsets.all(10),

          shape: RoundedRectangleBorder(borderRadius: 
BorderRadius.circular(20)),
          onPressed: () {},
          child: Text("Button"),
        ),
      ),

0

Спробуй

Expanded(   
  child: RaisedButton(
    onPressed: _onButtonPressed,
    child: Text('Button1')
  )  
)

0

Якщо ви не хочете видаляти всі налаштовані теми кнопок.




ButtonTheme.fromButtonThemeData(
  data: Theme.of(context).buttonTheme.copyWith(
                minWidth: 200.0,
                height: 100.0,,
              )
  child: RaisedButton(
    onPressed: () {},
    child: Text("test"),
  ),
);


0

Якщо у вас є кнопка всередині стовпця () і ви хочете, щоб кнопка приймала максимальну ширину, встановіть:

crossAxisAlignment: CrossAxisAlignment.stretch

у віджеті Стовпець. Тепер все в цьому стовпці () матиме максимально доступну ширину


-1

Це спрацювало для мене. Контейнер забезпечує висоту, а FractionallySizedBox - ширину RaisedButton.

Container(
  height: 50.0, //Provides height for the RaisedButton
  child: FractionallySizedBox(
    widthFactor: 0.7, ////Provides 70% width for the RaisedButton
    child: RaisedButton(
      onPressed: () {},
    ),
  ),
),

-2

Коротке та солодке рішення для кнопки на всю ширину:

Row(
  children: [
    Expanded(
      child: ElevatedButton(...),
    ),
  ],
)

Це ні коротко, ні солодко. Ви просто додаєте зайві віджети в ієрархію дерев. Чому б просто не використовувати double.infinityв SizedBox? Це буде набагато "коротше" і "солодше".
— iDecode

У прикладі не використовуються зайві віджети. Якщо ви маєте на увазі, що ви можете досягти одного результату за допомогою різних віджетів, то я б сказав, що це інше. У будь-якому випадку, я не знав, що ми можемо використовувати SizedBox без фіксованого розміру. Розглядаючи це, я виявив, SizedBox.expand()що, мабуть, було б кращим, ніж використання double.infinity.
— fromvega

SizedBox.expandє по суті a SizedBoxз widthі heightвстановлено double.infinity. Отже, навіть ви SizedBox.expandне зможете відповісти на запитання, яке стосується widthі ні width + height.
— iDecode

У будь-якому випадку, назва запитання стосується встановлення ширини кнопки. Я думаю, що моя відповідь корисна іншим, як я, які прийшли сюди, шукаючи спосіб зробити кнопку на всю ширину.
— fromvega

Ваша відповідь додає непотрібні віджети для виконання більш простого завдання. Це може бути погано для продуктивності.
— iDecode
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.