В настоящее время я разрабатываю приложение для Android на Flutter. Как добавить округлую кнопку?

Kingsley Kbc Comics

Ответов: 29

Ответы (29)

1. Обзор решения

FlatButton и RaisedButton устарели.

Итак, вы можете использовать shape, помещенное в свойство style, для TextButton и ElevatedButton.

По сравнению с Flutter 2.0 есть некоторые изменения:

2. Кнопка с закругленными краями

Внутри свойства style существует свойство shape:

стиль: ButtonStyle (
  форма: MaterialStateProperty.all  (
    RoundedRectangleBorder (
      borderRadius: BorderRadius.circular (18.0),
      сторона: BorderSide (цвет: Colors.red)
    )
  )
)

Enter image description here

Квадратная кнопка

Для квадратной кнопки вы можете использовать ElevatedButton или иначе добавить:

стиль: ButtonStyle (
  форма: MaterialStateProperty.all  (
    RoundedRectangleBorder (
      borderRadius: BorderRadius.zero,
      сторона: BorderSide (цвет: Colors.red)
    )
  )
)

Enter image description here

Полный пример

Строка (
  mainAxisAlignment: MainAxisAlignment.end,
  дети: [
    TextButton (
      ребенок: Текст (
        "В корзину" .toUpperCase (),
        стиль: TextStyle (fontSize: 14)
      ),
      стиль: ButtonStyle (
        заполнение: MaterialStateProperty.all  (EdgeInsets.all (15)),
        foregroundColor: MaterialStateProperty.all  (Colors.red),
        форма: MaterialStateProperty.all  (
          RoundedRectangleBorder (
            borderRadius: BorderRadius.circular (18.0),
            сторона: BorderSide (цвет: Colors.red)
          )
        )
      ),
      onPressed: () => нуль
    ),
    SizedBox (ширина: 10),
    ElevatedButton (
      ребенок: Текст (
        "Купить сейчас" .toUpperCase (),
        стиль: TextStyle (fontSize: 14)
      ),
      стиль: ButtonStyle (
        foregroundColor: MaterialStateProperty.all  (Colors.white),
        backgroundColor: MaterialStateProperty.all  (Colors.red),
        форма: MaterialStateProperty.all  (
          RoundedRectangleBorder (
            borderRadius: BorderRadius.zero,
            сторона: BorderSide (цвет: Colors.red)
          )
        )
      ),
      onPressed: () => нуль
    )
  ]
)

RaisedButton(
          child: Text("Button"),
          onPressed: (){},
          shape: RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0),
          side: BorderSide(color: Colors.red))
        )

Вы можете просто использовать RaisedButton


Заполнение (
  отступ: EdgeInsets.only (слева: 150,0, справа: 0,0),
  дочерний элемент: RaisedButton (
    textColor: Colors.white,
    цвет: Цвета. черный,
    ребенок: Текст ("Поиск"),
    onPressed: () {},
    shape: новый RoundedRectangleBorder (
      borderRadius: новый BorderRadius.circular (30.0),
    ),
  ),
)

Вывод:

enter image description here

Подробнее: RSCoder

Обновить

Поскольку левые кнопки устарели, используйте правые.

Deprecated    -->   Recommended

RaisedButton  -->   ElevatedButton
OutlineButton -->   OutlinedButton
FlatButton    -->   TextButton

  • ElevatedButton

  1. Использование StadiumBorder

    enter image description here

    ElevatedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: ElevatedButton.styleFrom (форма: StadiumBorder ()),
    )
    
  2. Использование RoundedRectangleBorder

    enter image description here

    ElevatedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: ElevatedButton.styleFrom (
        форма: RoundedRectangleBorder (
          borderRadius: BorderRadius.circular (12), // <- Радиус
        ),
      ),
    )
    
  3. Использование CircleBorder

    enter image description here

    ElevatedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: ElevatedButton.styleFrom (
        форма: CircleBorder (),
        обивка: EdgeInsets.all (24),
      ),
    )
    
  4. Использование BeveledRectangleBorder

    enter image description here

    ElevatedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: ElevatedButton.styleFrom (
        форма: BeveledRectangleBorder (
          borderRadius: BorderRadius.circular (12)
        ),
      ),
    )
    

OutistedButton

  1. Использование StadiumBorder

    enter image description here

    OutlinedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: OutlinedButton.styleFrom (
        форма: StadiumBorder (),
      ),
    )
    
  2. Использование RoundedRectangleBorder

    enter image description here

    OutlinedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: OutlinedButton.styleFrom (
        форма: BeveledRectangleBorder (
          borderRadius: BorderRadius.circular (12),
        ),
      ),
    )
    
  3. Использование CircleBorder:

    enter image description here

    OutlinedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: OutlinedButton.styleFrom (
        форма: CircleBorder (),
        обивка: EdgeInsets.all (24),
      ),
    )
    
  4. Использование BeveledRectangleBorder

    enter image description here

    OutlinedButton (
      onPressed: () {},
      дочерний: Текст ('Кнопка'),
      style: OutlinedButton.styleFrom (
        форма: BeveledRectangleBorder (
          borderRadius: BorderRadius.circular (12),
        ),
      ),
    )
    

TextButton

TextButton также работает аналогично ElevatedButton и OutlinedButton, однако вы можете видеть фигуры только при нажатии кнопки.

Чтобы использовать любую форму в вашей кнопке, убедитесь, что вы выполнили весь код внутри Button виджета:

 **shape: RoundedRectangleBorder(
        borderRadius: new BorderRadius.circular(18.0),
        side: BorderSide(color: Colors.red) ),**

Если вы хотите сделать это квадрат, используйте BorderRadius.circular (0.0) Он автоматически превращает его в квадрат.

Кнопка такая:

Enter image description here

Вот весь исходный код для данного экрана пользовательского интерфейса:

 Scaffold(
    backgroundColor: Color(0xFF8E44AD),
    body: new Center(
      child: Column(
        children: [
          Container(
            margin: EdgeInsets.fromLTRB(90, 10, 20, 0),
            padding: new EdgeInsets.only(top: 92.0),
            child: Text(
              "Currency Converter",
              style: TextStyle(
                fontSize: 48,
                fontWeight: FontWeight.bold,
                color: Colors.white,
              ),
            ),
          ),
          Container(
            margin: EdgeInsets.only(),
            padding: EdgeInsets.all(25),
            child: TextFormField(
              decoration: new InputDecoration(
                filled: true,
                fillColor: Colors.white,
                labelText: "Amount",
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10),
                ),
              ),
            ),
          ),
          Container(
            padding: EdgeInsets.all(25),
            child: TextFormField(
              decoration: new InputDecoration(
                filled: true,
                fillColor: Colors.white,
                labelText: "From",
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(10),
                ),
              ),
            ),
          ),
          Container(
            padding: EdgeInsets.all(25),
            child: TextFormField(
              decoration: new InputDecoration(
                  filled: true,
                  fillColor: Colors.white,
                  labelText: "To",
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(10),
                  )),
            ),
          ),
          SizedBox(height: 20.0),
          MaterialButton(
            height: 58,
            minWidth: 340,
            shape: RoundedRectangleBorder(
                borderRadius: new BorderRadius.circular(12)),
            onPressed: () {},
            child: Text(
              "CONVERT",
              style: TextStyle(
                fontSize: 24,
                color: Colors.black,
              ),
            ),
            color: Color(0xFFF7CA18),
          ),
        ],
      ),
    ),
  ),
);

Вот еще одно решение:

Container(
    height: MediaQuery.of(context).size.height * 0.10,
    width: MediaQuery.of(context).size.width,
    child: ButtonTheme(
        minWidth: MediaQuery.of(context).size.width * 0.75,
        child: RaisedButton(
            shape: RoundedRectangleBorder(
                borderRadius: new BorderRadius.circular(25.0),
                side: BorderSide(color: Colors.blue)),
                onPressed: () async {
                    // Do something
                },
                color: Colors.red[900],
                textColor: Colors.white,
                child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text("Button Text,
                    style: TextStyle(fontSize: 24)),
            ),
        ),
    ),
),

Вот код вашей проблемы. Достаточно взять простой контейнер с радиусом рамки в украшении коробки.

new Container(
    alignment: Alignment.center,
    decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(15.0)),
        color: Colors.blue,
    ),

    child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
            Padding(
                padding: const EdgeInsets.all(10.0),
                child: new Text(
                    "Next",
                    style: new TextStyle(
                        fontWeight: FontWeight.w500,
                        color: Colors.white,
                        fontSize: 15.0,
                    ),
                ),
            ),
        ],
    ),
),

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

FlatButton (
  заполнение: EdgeInsets.all (30.0),
  цвет: Цвета. черный,
  форма: RoundedRectangleBorder (
    borderRadius: BorderRadius.circular (20.0)),
  child: child: Text (
    "Кнопка",
    стиль: TextStyle (цвет: Colors.white),
  ),
  onPressed: () {
    print ('Кнопка нажата');
  },
),

Примечание: чтобы изменить округлость, отрегулируйте значение внутри BorderRadius.circular ()

     Container(
        width: yourWidth,
        height: yourHeight ,
        decoration: BoxDecoration(
            borderRadius: radius,
            gradient: yourGradient,
            border: yourBorder),
        child: FlatButton(
          onPressed: {} (),
          shape: RoundedRectangleBorder(borderRadius: radius),
    .......

и использовать тот же радиус.

Since September 2020, Flutter 1.22.0:

Both "RaisedButton" and "FlatButton" are deprecated.

The most up-to-date solution is to use new buttons:

1. ElevatedButton:

Button without an icon

Button with an icon

Code:

ElevatedButton(
  child: Text("ElevatedButton"),
  onPressed: () => print("it's pressed"),
  style: ElevatedButton.styleFrom(
    primary: Colors.red,
    onPrimary: Colors.white,
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(32.0),
    ),
  ),
)

Don't forget, there's also an .icon constructor to add an icon easily:

ElevatedButton.icon(
  icon: Icon(Icons.thumb_up),
  label: Text("Like"),
  onPressed: () => print("it's pressed"),
  style: ElevatedButton.styleFrom(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(32.0),
    ),
  ),
)

2. OutlinedButton:

Outlined button

Code:

OutlinedButton.icon(
  icon: Icon(Icons.star_outline),
  label: Text("OutlinedButton"),
  onPressed: () => print("it's pressed"),
  style: ElevatedButton.styleFrom(
    side: BorderSide(width: 2.0, color: Colors.blue),
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(32.0),
    ),
  ),
)

3. TextButton:

You can always use TextButton if you don't want an outline or color fill.

Различные способы создания кнопки с закругленными углами:

ElevatedButton с ElevatedButton.styleFrom

ElevatedButton(
          style: ElevatedButton.styleFrom(
            shape: new RoundedRectangleBorder(
              borderRadius: new BorderRadius.circular(30.0),
            ),
          ),
          onPressed: () {},
          child:
              Text("Buy now".toUpperCase(), style: TextStyle(fontSize: 14)),
        ),

ElevatedButton с ButtonStyle

ElevatedButton(
          style: ButtonStyle(
              shape: MaterialStateProperty.all(
                  RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(50.0),
          ))),
          onPressed: () {},
          child: Text("Submit".toUpperCase()),
        ),

Практическую демонстрацию круглой кнопки можно найти по приведенной ниже ссылке на Dartpad:

Примеры демонстрации закругленных кнопок на DartPad

Screenshot of dartpad

New Elevate Button

Style

customElevatedButton({radius, color}) => ElevatedButton.styleFrom(
    shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(radius == null ? 100 : radius),
    ),
    primary: color,
);

Icon

Widget saveIcon() => iconsStyle1(
    Icons.save,
);

// Common icon style

iconsStyle1(icon) => Icon(
    icon,
    color: white,
    size: 15,
);

Button use

ElevatedButton.icon(
    icon: saveIcon(),
    style:
        customElevatedButton(color: Colors.green[700]),
    label: Text('Save',
        style: TextStyle(color: Colors.white)),
    onPressed: () {
    },
),

Как это выглядит!

Вместо этого используйте TextButton.

Кнопки, такие как FlatButton, RaisedButton и OutlineButton, считаются устаревшими с октября 2020 года. Это одна из попыток команды разработчиков Flutter упростить и сделать Flutter API согласованным, вы можете настроить его стиль, используя свойство style.

      TextButton(
        child: Padding(
          padding: const EdgeInsets.only(left: 10.0, right: 10.0),
          child: Text('Text here',
              style: TextStyle(
                  color: Colors.teal,
                  fontSize: 14,
                  fontWeight: FontWeight.w500)),
        ),
        style: TextButton.styleFrom(
          primary: Colors.teal,
          onSurface: Colors.yellow,
          side: BorderSide(color: Colors.teal, width: 2),
          shape: const RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(25))),
        ),
        onPressed: () {
          print('Pressed');
        },
      ),

вы можете использовать этот код:

ElevatedButton(
      onPressed: () {},
      style: ElevatedButton.styleFrom(
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(borderRadius))),
      ),
      child: Text("ok"),
    )

Вы всегда можете использовать кнопку материала, если вы используете приложение «Материал» в качестве основного виджета.

Padding(
  padding: EdgeInsets.symmetric(vertical: 16.0),
  child: Material(
    borderRadius: BorderRadius.circular(30.0),//Set this up for rounding corners.
    shadowColor: Colors.lightBlueAccent.shade100,
    child: MaterialButton(
      minWidth: 200.0,
      height: 42.0,
      onPressed: (){//Actions here//},
      color: Colors.lightBlueAccent,
      child: Text('Log in', style: TextStyle(color: Colors.white),),
    ),
  ),
)

Вы можете использовать приведенный ниже код для создания закругленной кнопки с градиентным цветом.

 Container(
          width: 130.0,
          height: 43.0,
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(30.0),
            gradient: LinearGradient(
              // Where the linear gradient begins and ends
              begin: Alignment.topRight,
              end: Alignment.bottomLeft,
              // Add one stop for each color. Stops should increase from 0 to 1
              stops: [0.1, 0.9],
              colors: [
                // Colors are easy thanks to Flutter's Colors class.
                Color(0xff1d83ab),
                Color(0xff0cbab8),
              ],
            ),
          ),
          child: FlatButton(
            child: Text(
              'Sign In',
              style: TextStyle(
                fontSize: 16.0,
                fontFamily: 'Righteous',
                fontWeight: FontWeight.w600,
              ),
            ),
            textColor: Colors.white,
            color: Colors.transparent,
            shape:
                RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
            onPressed: () {

            },
          ),
        );

Вы можете создать собственное представление и поместить его в GestureDetector, чтобы он работал как кнопка. Преимущество состоит в том, что вы можете предоставить бесконечное количество типов пользовательского декора (в том числе сделать его круглым с заданным радиусом) для контейнера.

Если кто-то ищет полноценную круглую кнопку, я добился этого следующим образом:

Center(
            child: SizedBox.fromSize(
              size: Size(80, 80), // Button width and height
              child: ClipOval(
                child: Material(
                  color: Colors.pink[300], // Button color
                  child: InkWell(
                    splashColor: Colors.yellow, // splash color
                    onTap: () {}, // Button pressed
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Icon(Icons.linked_camera), // Icon
                        Text("Picture"), // Text
                      ],
                    ),
                  ),
                ),
              ),
            ),
          )

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

style: ButtonStyle(
              elevation: MaterialStateProperty.all(8.0),
              backgroundColor:
                  MaterialStateProperty.all(Constants().orangeColor),
              textStyle: MaterialStateProperty.all(
                TextStyle(
                  fontSize: 16.0,
                ),
              ),
              shape: MaterialStateProperty.all(
                CircleBorder(),
              ),
              shadowColor: MaterialStateProperty.all(Constants().orangeColor),
            ),

Теперь у нас есть кнопка Icon для получения закругленных кнопок и наложения. Однако цвет фона пока недоступен, но то же самое может быть достигнуто с помощью виджета аватара Круг следующим образом:

CircleAvatar(
    backgroundColor: const Color(0xffF4F3FA),
    child: IconButton(
        onPressed: () => FlushbarHelper.createInformation(
                             message: 'Work in progress...')
                             .show(context),
        icon: Icon(Icons.more_vert),
    ),
),

Вы можете использовать виджет ElevatedButton. Виджет с повышенной кнопкой имеет свойство shape, которое вы можете использовать, как показано в приведенном ниже фрагменте.

ElevatedButton(
      style: ButtonStyle(
          shape: MaterialStateProperty.all(
              RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(18.0),
                  side: BorderSide(
                      color: Colors.teal, 
                      width: 2.0,
                  ),
              ),
          ),
      ),
      child: Text('Submit'),
      onPressed: () {},
),
addButton() {
return Row(
  mainAxisAlignment: MainAxisAlignment.center,
  children: [
    Padding(
      padding: const EdgeInsets.symmetric(vertical: 10.0),
      child: SizedBox(
        height: 45,
        width: 200,
        child: ElevatedButton.icon(
          onPressed: () async {},
          style: ButtonStyle(
            shape: MaterialStateProperty.all(
                RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(30.0),
                  )),
            elevation: MaterialStateProperty.all(1),
            backgroundColor: MaterialStateProperty.all(Colors.blue),
          ),
          icon: Icon(Icons.add, size: 18),
          label: Text("Add question"),
        ),
      ),
    ),
  ],
);

}

Еще одно крутое решение, которое работает в 2021 году:

TextButton(
    child: Padding(
        padding: const EdgeInsets.all(5.0),
        child: Text('Follow Us'.toUpperCase()),
    ),
    style: TextButton.styleFrom(
        backgroundColor: Colors.amber,
        shadowColor: Colors.red,
        elevation: 2,
        textStyle: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(5.0),)
    ),
    onPressed: () {
        print('Pressed');
    },
),

Вы можете использовать этот код для прозрачной закругленной кнопки, передав прозрачный цвет свойству цвета внутри BoxDecoration. например.цвет: Цвета. Прозрачный. Также обратите внимание, что эта кнопка использует только виджеты Container и GestureDetector.

Container(
    height: 50.0,
    child: GestureDetector(
        onTap: () {},
        child: Container(
            decoration: BoxDecoration(
                border: Border.all(
                    color: Color(0xFFF05A22),
                    style: BorderStyle.solid,
                    width: 1.0,
                ),
                color: Colors.transparent,
                borderRadius: BorderRadius.circular(30.0),
            ),
            child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                    Center(
                        child: Text(
                           "BUTTON",
                            style: TextStyle(
                                color: Color(0xFFF05A22),
                                fontFamily: 'Montserrat',
                                fontSize: 16,
                                fontWeight: FontWeight.w600,
                                letterSpacing: 1,
                            ),
                        ),
                    )
                ],
            ),
        ),
    ),
)

Transaparent Background Button

Оберните TextButton в виджет-контейнер, как показано в приведенном ниже фрагменте кода:

Контейнер (
  украшение: BoxDecoration (
    borderRadius: BorderRadius.circular (5),
    граница: Border.all (цвет: Colors.black),
  ),
  дочерний элемент: TextButton (
    onPressed: () {
      // Сделать
    },
    child: Text («Перейти к экрану изменения языка»),
  ),
)

Вы также можете достичь этого, используя StadiumBorder shape:

FlatButton(
  onPressed: () {},
  child: Text('StadiumBorder'),
  shape: StadiumBorder(),
  color: Colors.pink,
  textColor: Colors.white,
),

Enter image description here

Во Flutter виджет Container () используется для стилизации вашего виджета. Используя виджет Container (), вы можете установить границу или закругленный угол любого виджета.

Если вы хотите установить любой тип стиля и оформление, поместите этот виджет в виджет Container (). Это придает декору множество свойств.

Container(
  width: 100,
  padding: EdgeInsets.all(10),
  alignment: Alignment.center,
  decoration: BoxDecoration(
          color: Colors.blueAccent,
          borderRadius: BorderRadius.circular(30)), // Make rounded corner
  child: Text("Click"),
)

Вы можете просто использовать RaisedButton или InkWell, чтобы получить настраиваемую кнопку, а также такие свойства, как onDoubleTap, onLongPress, и т. Д.:

new InkWell(
  onTap: () => print('hello'),
  child: new Container(
    //width: 100.0,
    height: 50.0,
    decoration: new BoxDecoration(
      color: Colors.blueAccent,
      border: new Border.all(color: Colors.white, width: 2.0),
      borderRadius: new BorderRadius.circular(10.0),
    ),
    child: new Center(child: new Text('Click Me', style: new TextStyle(fontSize: 18.0, color: Colors.white),),),
  ),
),

Enter image description here

Если вы хотите использовать свойства splashColor и highlightColor в виджете InkWell, используйте Материал виджет в качестве родителя виджета InkWell вместо украшения контейнера (удаление свойства украшения).О том, почему, читайте здесь.

Вы также можете использовать ButtonTheme ():

Enter image description here

Вот пример кода -

ButtonTheme(
    minWidth: 200.0,
    shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(18.0),
        side: BorderSide(color: Colors.green)),
    child: RaisedButton(
        elevation: 5.0,
        hoverColor: Colors.green,
        color: Colors.amber,
        child: Text(
            "Place Order",
            style: TextStyle(
                     color: Colors.white, fontWeight: FontWeight.bold),
        ),
        onPressed: () {},
    ),
),

2022 WebDevInsider