Button Widget

上一篇博文中我们学习了GestureDetector,了解到借助GestureDetector可以赋予某些本身不具备点击回调的widget点击回调能力,完成跟用户的一些简单手势交互并作出相应的逻辑处理,我们还提到了有些widget像RaisedButton和FloatingActionButton控件本身就有onPressed回调,当用户点击控件时触发回调。本篇博客中我们就把上篇博客中提及到的各种Button归类统一说明一下。

Button集合效果图
5. Button Widget - 图1

上述RaisedButton、FlatButton、OutlineButton、MaterialButton、还有RawMaterialButton、FloationgActionButton,我分三类给大家讲解,OutlineButton作为一类,RaisedButton、FlatButton、MaterialButton、RawMaterialButton不论是从构造方法还是使用上都很相似,这几个button分为一类,另外FloatingActionButton作为一类。

1.OutlineButton:

OutlineButton默认带有一个边框,我们可以通过属性指定正常状态,跟用户点击状态下的边框颜色。
5. Button Widget - 图2

我们来看下OutlineButton的构造方法,并且对它的相应属性做下使用说明。

  1. const OutlineButton({
  2. Key key,
  3. @required VoidCallback onPressed,
  4. ButtonTextTheme textTheme,
  5. Color textColor,
  6. Color disabledTextColor,
  7. Color color,
  8. Color highlightColor,
  9. Color splashColor,
  10. double highlightElevation,
  11. this.borderSide,
  12. this.disabledBorderColor,
  13. this.highlightedBorderColor,
  14. EdgeInsetsGeometry padding,
  15. ShapeBorder shape,
  16. Clip clipBehavior = Clip.none,
  17. Widget child,
  18. })

上述OutlineButton效果图上两个button的具体代码:

未指定任何样式:

  1. new OutlineButton(onPressed: () {}, child: new Text("OutlineButton")),

效果图
5. Button Widget - 图3
设置边框样式

  1. new OutlineButton(
  2. textColor: Colors.blue,
  3. highlightedBorderColor: Colors.deepOrange,
  4. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),
  5. borderSide: new BorderSide(color: Colors.blueAccent),
  6. onPressed: () {},
  7. child: new Text("OutlineButton")
  8. ),

效果图
5. Button Widget - 图4

2.FloatingActionButton

FloatingActionButton做过原生安卓开发的读者应该很熟悉这个名字,在Flutter中不光引用了原生安卓的叫法,使用方法也大同小异。
构造方法

  1. const FloatingActionButton({
  2. Key key,
  3. this.child,
  4. this.tooltip,
  5. this.foregroundColor,
  6. this.backgroundColor,
  7. this.heroTag = const _DefaultHeroTag(),
  8. this.elevation = 6.0,
  9. this.highlightElevation = 12.0,
  10. @required this.onPressed,
  11. this.mini = false,
  12. this.shape = const CircleBorder(),
  13. this.clipBehavior = Clip.none,
  14. this.materialTapTargetSize,
  15. this.isExtended = false,
  16. })

由于使用方法跟原生安卓中类似,我就不展开详细讲解了,稍后我会把篇首效果图上的所有代码贴上,大家可参考里面对floatingactionbutton的用法。

3.RaisedButton、FlatButton、OutlineButton、MaterialButton

这几类button十分类似,所以我把他们归为一类做讲解,但是也会有细微的差别,像FlatButton不支持设置手指点击抬起后的颜色,其他常规用法几乎一致,关于具体的细微差别,读者可自行对比构造方法,自行测试,我拿RaisedButton把代码,贴上代码,为大家演示下这几类Button的常用属性配置说明。

  1. new RaisedButton(
  2. color: Colors.blueAccent,
  3. padding: EdgeInsets.all(15.0),
  4. textColor: Colors.white,
  5. textTheme: ButtonTextTheme.normal,
  6. onHighlightChanged: (bool b) {
  7. },
  8. disabledTextColor: Colors.black54,
  9. disabledColor: Colors.black54,
  10. highlightColor: Colors.green,
  11. splashColor: Colors.amberAccent,
  12. colorBrightness: Brightness.light,
  13. elevation: 10.0,
  14. highlightElevation: 10.0,
  15. disabledElevation: 10.0,
  16. shape: new RoundedRectangleBorder(
  17. borderRadius: BorderRadius.circular(20.0)),
  18. onPressed: () {},
  19. child: new Text("RaisedButton"),
  20. ),

上述讲解中读者如果有不明白的地方可以参考文章开篇中贴出的各种button的效果图源码做参考,或者留言给我一块探讨,文章开篇中贴出的各种button的效果图源码如下。

  1. import 'package:flutter/material.dart';
  2. void main() {
  3. runApp(new MaterialApp(home: new ButtonPage()));
  4. }
  5. class ButtonPage extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return new Scaffold(
  9. appBar: new AppBar(
  10. title: new Text("Button Widget"),
  11. ),
  12. floatingActionButton: new FloatingActionButton(
  13. onPressed: () {}, child: new Icon(Icons.adb), tooltip: "点击"),
  14. body: new ListView(
  15. children: <Widget>[
  16. new Text("简单样式",
  17. textAlign: TextAlign.center,
  18. style: new TextStyle(color: Colors.brown, fontSize: 20.0)),
  19. new RaisedButton(onPressed: () {}, child: new Text("RaisedButton")),
  20. new FlatButton(onPressed: () {}, child: new Text("FlatButton")),
  21. new MaterialButton(
  22. onPressed: () {}, child: new Text("MaterialButton")),
  23. new RawMaterialButton(
  24. onPressed: () {}, child: new Text("RawMaterialButton")),
  25. new OutlineButton(onPressed: () {}, child: new Text("OutlineButton")),
  26. new SizedBox(height: 20),
  27. new Text("升级样式",
  28. textAlign: TextAlign.center,
  29. style: new TextStyle(color: Colors.brown, fontSize: 20.0)),
  30. new RaisedButton(
  31. color: Colors.blueAccent,
  32. padding: EdgeInsets.all(15.0),
  33. textColor: Colors.white,
  34. textTheme: ButtonTextTheme.normal,
  35. onHighlightChanged: (bool b) {
  36. },
  37. disabledTextColor: Colors.black54,
  38. disabledColor: Colors.black54,
  39. highlightColor: Colors.green,
  40. splashColor: Colors.amberAccent,
  41. colorBrightness: Brightness.light,
  42. elevation: 10.0,
  43. highlightElevation: 10.0,
  44. disabledElevation: 10.0,
  45. shape: new RoundedRectangleBorder(
  46. borderRadius: BorderRadius.circular(20.0)),
  47. onPressed: () {},
  48. child: new Text("RaisedButton"),
  49. ),
  50. new FlatButton(
  51. color: Colors.lightGreen,
  52. textColor: Colors.red,
  53. onPressed: () {}, child: new Text("FlatButton")),
  54. new OutlineButton(
  55. textColor: Colors.blue,
  56. highlightedBorderColor: Colors.deepOrange,
  57. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)),
  58. borderSide: new BorderSide(color: Colors.blueAccent),
  59. onPressed: () {},
  60. child: new Text("OutlineButton")
  61. ),
  62. MaterialButton(
  63. color: Colors.yellow,
  64. textColor: Colors.red,
  65. onPressed: () {},
  66. child: new Text("MaterialButton")
  67. ),
  68. RawMaterialButton(
  69. fillColor: Colors.deepOrange,
  70. onPressed: () {},
  71. child: new Text("RawMaterialButton",style: new TextStyle(color: Colors.white),)
  72. )
  73. ],
  74. ),
  75. );
  76. }
  77. }