我目前正在Flutter开发一个Android应用程序。我如何添加一个圆形按钮?
你可以使用ElevatedButton小部件。提升的按钮小部件有一个shape属性,你可以在下面的代码片段中使用它。
ElevatedButton
shape
ElevatedButton( style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(18.0), side: BorderSide( color: Colors.teal, width: 2.0, ), ), ), ), child: Text('Submit'), onPressed: () {}, ),
你可以简单地使用RaisedButton或使用InkWell来获得一个自定义按钮以及诸如onDoubleTap, onLongPress, 等。这样的属性:
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),),), ), ),
如果你想在InkWell小部件中使用splashColor和highlightColor属性,使用Material小部件作为InkWell小部件的父部件,而不是装饰容器(删除装饰属性)。在这里阅读原因。
splashColor
highlightColor
Material
如果你使用材质应用程序作为你的主小部件,你总是可以使用材质按钮。
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),), ), ), )
你可以简单地使用RaisedButton
Padding( padding: EdgeInsets.only(left: 150.0, right: 0.0), child: RaisedButton( textColor: Colors.white, color: Colors.black, child: Text("Search"), onPressed: () {}, shape: new RoundedRectangleBorder( borderRadius: new BorderRadius.circular(30.0), ), ), )
输出:
更多信息:RSCoder
您可以使用下面的代码创建一个渐变颜色的圆形按钮。
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: () { }, ), );
BoxDecoration
color: Colors.transparent
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: <Widget>[ Center( child: Text( "BUTTON", style: TextStyle( color: Color(0xFFF05A22), fontFamily: 'Montserrat', fontSize: 16, fontWeight: FontWeight.w600, letterSpacing: 1, ), ), ) ], ), ), ), )
由于左侧按钮现在已弃用,请使用右侧按钮。
Deprecated --> Recommended RaisedButton --> ElevatedButton OutlineButton --> OutlinedButton FlatButton --> TextButton
StadiumBorder
ElevatedButton( onPressed: () {}, child: Text('Button'), style: ElevatedButton.styleFrom(shape: StadiumBorder()), )
RoundedRectangleBorder
ElevatedButton( onPressed: () {}, child: Text('Button'), style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), // <-- Radius ), ), )
CircleBorder
ElevatedButton( onPressed: () {}, child: Text('Button'), style: ElevatedButton.styleFrom( shape: CircleBorder(), padding: EdgeInsets.all(24), ), )
BeveledRectangleBorder
ElevatedButton( onPressed: () {}, child: Text('Button'), style: ElevatedButton.styleFrom( shape: BeveledRectangleBorder( borderRadius: BorderRadius.circular(12) ), ), )
OutlinedButton
OutlinedButton( onPressed: () {}, child: Text('Button'), style: OutlinedButton.styleFrom( shape: StadiumBorder(), ), )
OutlinedButton( onPressed: () {}, child: Text('Button'), style: OutlinedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), )
OutlinedButton( onPressed: () {}, child: Text('Button'), style: OutlinedButton.styleFrom( shape: CircleBorder(), padding: EdgeInsets.all(24), ), )
OutlinedButton( onPressed: () {}, child: Text('Button'), style: OutlinedButton.styleFrom( shape: BeveledRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), )
TextButton也类似于ElevatedButton和OutlinedButton,但是,只有在按下按钮时才能看到形状。
TextButton
1. 解决方案概述
FlatButton和RaisedButton已弃用。
FlatButton
所以,你可以在style属性中使用shape,用于TextButton和ElevatedButton。
style
自Flutter 2.0以来有一些变化:
ButtonStyle
MaterialStateProperty<T>
2. 圆形的按钮
在style属性中存在shape属性:
style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(18.0), side: BorderSide(color: Colors.red) ) ) )
方形按钮
对于方形按钮,你可以使用ElevatedButton或其他方式添加:
style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.zero, side: BorderSide(color: Colors.red) ) ) )
完整的示例
Row( mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( child: Text( "Add to cart".toUpperCase(), style: TextStyle(fontSize: 14) ), style: ButtonStyle( padding: MaterialStateProperty.all<EdgeInsets>(EdgeInsets.all(15)), foregroundColor: MaterialStateProperty.all<Color>(Colors.red), shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(18.0), side: BorderSide(color: Colors.red) ) ) ), onPressed: () => null ), SizedBox(width: 10), ElevatedButton( child: Text( "Buy now".toUpperCase(), style: TextStyle(fontSize: 14) ), style: ButtonStyle( foregroundColor: MaterialStateProperty.all<Color>(Colors.white), backgroundColor: MaterialStateProperty.all<Color>(Colors.red), shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.zero, side: BorderSide(color: Colors.red) ) ) ), onPressed: () => null ) ] )
在Flutter中,Container()小部件用于样式化小部件。使用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"), )
如果有人正在寻找完整的圆形按钮,那么我实现它的方式:
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: <Widget>[ Icon(Icons.linked_camera), // Icon Text("Picture"), // Text ], ), ), ), ), ), )
要在按钮中使用任何形状,请确保在按钮小部件中执行所有代码:
**shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(18.0), side: BorderSide(color: Colors.red) ),**
如果你想使它是广场,使用BorderRadius.circular(0.0)。它会自动使它成为广场。
BorderRadius.circular(0.0)
按钮是这样的:
下面是给出UI屏幕的所有源代码:
Scaffold( backgroundColor: Color(0xFF8E44AD), body: new Center( child: Column( children: <Widget>[ 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: <Widget>[ Padding( padding: const EdgeInsets.all(10.0), child: new Text( "Next", style: new TextStyle( fontWeight: FontWeight.w500, color: Colors.white, fontSize: 15.0, ), ), ), ], ), ),
RaisedButton( child: Text("Button"), onPressed: (){}, shape: RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0), side: BorderSide(color: Colors.red)) )
你可以创建一个自定义的视图,并把它放在一个姿态检测器中,让它表现得像一个按钮。这样做的好处是,您可以为容器提供无尽的自定义装饰类型(包括使其具有指定半径的圆形)。
现在我们有一个图标按钮来实现圆形按钮点击和覆盖。但是,背景颜色还不可用,但同样可以通过Circle头像小部件实现,如下所示:
CircleAvatar( backgroundColor: const Color(0xffF4F3FA), child: IconButton( onPressed: () => FlushbarHelper.createInformation( message: 'Work in progress...') .show(context), icon: Icon(Icons.more_vert), ), ),
你也可以使用ButtonTheme():
ButtonTheme()
下面是示例代码
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: () {}, ), ),
创建圆角按钮最简单的方法之一是使用FlatButton,然后通过设置其shape属性指定圆度。遵循下面的代码
FlatButton( padding: EdgeInsets.all(30.0), color: Colors.black, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20.0)), child: child: Text( "Button", style: TextStyle(color: Colors.white), ), onPressed: () { print('Button pressed'); }, ),
注意:为了改变圆度,调整BorderRadius.circular()中的值
BorderRadius.circular()
Container( width: yourWidth, height: yourHeight , decoration: BoxDecoration( borderRadius: radius, gradient: yourGradient, border: yourBorder), child: FlatButton( onPressed: {} (), shape: RoundedRectangleBorder(borderRadius: radius), .......
用同样的半径。
2020年9月起,Flutter 1.22.0:
两个“RaisedButton"和“;FlatButton"弃用。
代码:
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), ), ), )
别忘了,还有一个.icon构造函数可以方便地添加图标:
.icon
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), ), ), )
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), ), ), )
如果你不想要轮廓或颜色填充,你总是可以使用TextButton。
创建圆形的按钮的不同方法如下:
用ElevatedButton. stylefrom
ElevatedButton( style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30.0), ), ), onPressed: () {}, child: Text("Buy now".toUpperCase(), style: TextStyle(fontSize: 14)), ),
用ButtonStyle提升按钮
ElevatedButton( style: ButtonStyle( shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(50.0), ))), onPressed: () {}, child: Text("Submit".toUpperCase()), ),
圆形按钮的实际演示可以在下面的Dartpad链接中找到:
另一个很酷的解决方案在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'); }, ),
customElevatedButton({radius, color}) => ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radius == null ? 100 : radius), ), primary: color, );
Widget saveIcon() => iconsStyle1( Icons.save, ); // Common icon style iconsStyle1(icon) => Icon( icon, color: white, size: 15, );
ElevatedButton.icon( icon: saveIcon(), style: customElevatedButton(color: Colors.green[700]), label: Text('Save', style: TextStyle(color: Colors.white)), onPressed: () { }, ),
在容器小部件中包装一个TextButton,如下所示:
Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), border: Border.all(color: Colors.black), ), child: TextButton( onPressed: () { // To do }, child: Text("Go to Change Language Screen "), ), )
< / >
使用TextButton代替。
据说,自2020年10月以来,FlatButton、RaisedButton和OutlineButton等按钮已被弃用。这是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'); }, ),
addButton() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ 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>( 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"), ), ), ), ], );
}
你可以使用这个样式为你的elevatedButton使它成为圆形
style: ButtonStyle( elevation: MaterialStateProperty.all(8.0), backgroundColor: MaterialStateProperty.all(Constants().orangeColor), textStyle: MaterialStateProperty.all( TextStyle( fontSize: 16.0, ), ), shape: MaterialStateProperty.all<CircleBorder>( CircleBorder(), ), shadowColor: MaterialStateProperty.all(Constants().orangeColor), ),
你可以使用下面的代码:
ElevatedButton( onPressed: () {}, style: ElevatedButton.styleFrom( shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(borderRadius))), ), child: Text("ok"), )
MaterialButton
Shape
MaterialButton( onPressed: () {}, minWidth: MediaQuery.of(context).size.width * 0.4, height: 34, color: colorWhite, highlightColor: colorSplash, splashColor: colorSplash, visualDensity: VisualDensity.compact, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(4), side: BorderSide( color: colorGrey, width: 0.6, ), ), child: Text("CANCEL"), ),
还有另一种方法来做到这一点-只是使用FloatingActionButton适当的圆形按钮。
Scaffold( appBar: AppBar( title: const Text('Floating Action Button'), ), body: const Center(child: Text('Press the button below!')), floatingActionButton: FloatingActionButton( onPressed: () { // Add your onPressed code here! }, backgroundColor: Colors.green, child: const Icon(Icons.navigation), ), )
试试这个:
SizedBox( height: 40.0, child: MaterialButton( child: Text("Button"), color: Colors.blue, disabledColor: Colors.blue, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all( Radius.circular(10.0), // Change your border radius here ), ), onPressed: () {}, ), ),
使用Flutter版本2,请尝试以下操作
ElevatedButton( style: ButtonStyle( shape: MaterialStateProperty.all<OutlinedBorder>( RoundedRectangleBorder( side: BorderSide(width: 1.0, color: Colors.red, borderRadius: BorderRadius.circular(5.0),),), backgroundColor: MaterialStateProperty.all<Color>(Colors.red), foregroundColor: MaterialStateProperty.all<Color>(Colors.green), elevation: MaterialStateProperty.all<double>(8.0), padding: MaterialStateProperty.all<EdgeInsetsGeometry>( const EdgeInsets.symmetric( horizontal: 15.0, vertical: 10.0),),), onPressed: (){}, child: Text('Button'),)
在Null安全之后,使用ElevatedButton而不是RaisedButton,因为RaisedButton就像文档中说的那样被贬低了。
child: ElevatedButton( onPressed: () {}, child: const Text('Add item to the list'), style: ButtonStyle( backgroundColor: MaterialStateProperty.all<Color>(Common.buttonColor), shape: MaterialStateProperty.all<RoundedRectangleBorder>( RoundedRectangleBorder( borderRadius: BorderRadius.circular(18.0), ), ), ), ),
圆边颜色容器:
Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), border: Border.all(color: Colors.red), ), child: Text("Some Text"), )