Flutter 常用按鈕總結(jié)

博客地址:flutterall.com

本文我們就一起聊一聊Flutter中的Button析孽。由于Flutter是跨平臺的翰灾,所以有適用于Android和iOS的兩種風(fēng)格的組件枷畏。一套是Google極力推崇的Material,一套是iOS的Cupertino風(fēng)格的組件。無論哪種風(fēng)格,都是通用的。

Material與Cupertino風(fēng)格比較

控件 Material Cupertino
Button
RaisedButton
CupertinoButton
DatePick
showDatePicker
CupertinoDatePicker

從多年與設(shè)計師打交道來看亚享,App更青睞于iOS,很多Android的App做的跟iOS一樣一樣的盆犁,就連設(shè)計個按鈕圖標啥的都是一樣肚邢。

Material Style

RaisedButton(Material風(fēng)格的按鈕)


RaisedButton({
    Key key,
  //點擊按鈕的回調(diào)出發(fā)事件
    @required VoidCallback onPressed,
  //水波紋高亮變化回調(diào)
    ValueChanged<bool> onHighlightChanged,
  //按鈕的樣式(文字顏色、按鈕的最小大小摊溶,內(nèi)邊距以及shape)[ Used with [ButtonTheme] and [ButtonThemeData] to define a button's base
//colors, and the defaults for the button's minimum size, internal padding,and shape.]
    ButtonTextTheme textTheme,
    //文字顏色
    Color textColor,
    //按鈕被禁用時的文字顏色
    Color disabledTextColor,
    //按鈕的顏色
    Color color,
    //按鈕被禁用時的顏色  
    Color disabledColor,
    //按鈕的水波紋亮起的顏色
    Color highlightColor,
    //水波紋的顏色
    Color splashColor,
    //按鈕主題高亮
    Brightness colorBrightness,
    //按鈕下面的陰影長度
    double elevation,
    //按鈕高亮?xí)r的下面的陰影長度
    double highlightElevation,
    double disabledElevation,
    EdgeInsetsGeometry padding,
    ShapeBorder shape,
    Clip clipBehavior = Clip.none,
    MaterialTapTargetSize materialTapTargetSize,
    Duration animationDuration,
    Widget child,
  }

一張圖了解RaisedButton

圖示RaisedButton

Code


RaisedButton(
            textTheme: ButtonTextTheme.accent,
            color: Colors.teal,
            highlightColor: Colors.deepPurpleAccent,
            splashColor: Colors.deepOrangeAccent,
            colorBrightness: Brightness.dark,
            elevation: 50.0,
            highlightElevation: 100.0,
            disabledElevation: 20.0,
            onPressed: () {
              //TODO
            },
            child: Text(
              'RaisedButton',
              style: TextStyle(color: Colors.white, fontSize: 40),
            ),
          )

RaisedButton

FloatingActionButton(懸浮按鈕)

如果有時間爬骤,可以看看FlatButton的Material設(shè)計理念,效果還是很不錯的莫换。
例如:

FloatingActionButton

FloatingActionButton({
    Key key,
    //  按鈕上的組件霞玄,可以是Text、icon, etc.
    this.child,
    //長按提示
    this.tooltip,
    // child的顏色(盡在child沒有設(shè)置顏色時生效)
    this.foregroundColor,
    //背景色拉岁,也就是懸浮按鍵的顏色
    this.backgroundColor,
    this.heroTag = const _DefaultHeroTag(),
    //陰影長度
    this.elevation = 6.0,
    //高亮?xí)r陰影長度
    this.highlightElevation = 12.0,
    //按下事件回調(diào)
    @required this.onPressed,
    //是小圖標還是大圖標
    this.mini = false,
    //按鈕的形狀(例如:矩形Border坷剧,圓形圖標CircleBorder)
    this.shape = const CircleBorder(),
    this.clipBehavior = Clip.none,
    this.materialTapTargetSize,
    this.isExtended = false,
  })

Code

FloatingActionButton(
      child: Icon(Icons.access_alarm),
      tooltip: "ToolTip",
      foregroundColor: Colors.white,
      backgroundColor: Colors.deepPurple,
      shape: const Border(),
      onPressed: () {
        //click callback
      },
    )

FlatButton

一個扁平的Material按鈕

FlatButton.gif

FlatButton({
    Key key,
    @required VoidCallback onPressed,
    ValueChanged<bool> onHighlightChanged,
    ButtonTextTheme textTheme,
    Color textColor,
    Color disabledTextColor,
    Color color,
    Color disabledColor,
    Color highlightColor,
    Color splashColor,
    Brightness colorBrightness,
    EdgeInsetsGeometry padding,
    ShapeBorder shape,
    Clip clipBehavior = Clip.none,
    MaterialTapTargetSize materialTapTargetSize,
    @required Widget child,
  })

可以看到屬性跟RaisedButton類似,這里不多說了喊暖。


FlatButton(
        onPressed: () {},
        child: Text(
          "FlatBtn",
          style: TextStyle(fontSize: 20, color: Colors.deepPurple),
        ));

IconButton

圖標按鈕惫企,按下時會產(chǎn)生水波紋效果。

IconButton

IconButton({
//這幾個屬性跟前面講的幾個差不多陵叽,這里就不再講了狞尔。如有疑問,請留言巩掺。
    Key key,
    this.iconSize = 24.0,
    this.padding = const EdgeInsets.all(8.0),
    this.alignment = Alignment.center,
    @required this.icon,
    this.color,
    this.highlightColor,
    this.splashColor,
    this.disabledColor,
    @required this.onPressed,
    this.tooltip
  })

IconButton.gif

DropdownButton

Material Style 下拉菜單按鈕

DropdownButton
DropdownButton({
    Key key,
 //要顯示的列表
      List<DropdownMenuItem<T>> @required this.items,
 //下拉菜單選中的值(注意:在初始化時偏序,要么為null,這時顯示默認hint的值胖替;
 // 如果自己設(shè)定值研儒,則值必須為列表中的一個值,如果不在列表中刊殉,會拋出異常)
    T value,
//默認顯示的值
    Widget hint,
    Widget disabledHint,
//選中時的回調(diào)
   ValueChanged<T>  @required this.onChanged,
    this.elevation = 8,
    this.style,
    this.iconSize = 24.0,
    this.isDense = false,
    this.isExpanded = false,
  })

  • items

//返回城市列表殉摔,寫法一
List<DropdownMenuItem> _getItems() {
  List<DropdownMenuItem> items = new List();
  //value 表示DropdownButton.onChanged的返回值
  items.add(DropdownMenuItem(child: Text("北京"), value: "BJ"));
  items.add(DropdownMenuItem(child: Text("上海"), value: "SH"));
  items.add(DropdownMenuItem(child: Text("廣州"), value: "GZ"));
  items.add(DropdownMenuItem(child: Text("深圳"), value: "SZ"));
  return items;
}

//返回城市列表,寫法二
List<DropdownMenuItem<String>> _getCityList() {
  var list = ["北京", "上海", "廣州", "深圳"];
  return list.map((item) => DropdownMenuItem(
    value: item,
    child: Text(item),
  )).toList();
}

由于我們在點擊每一個條目后记焊,展示的選中條目會變化逸月,所以DropdownButton應(yīng)當繼承StatefulWidget,在選中條目后也就是onChange的回調(diào)中使用setState((){})更新對象的狀態(tài)遍膜。

  • DropdownButton

DropdownButton應(yīng)當繼承StatefulWidget


class FlutterDropdownButtonStatefulWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _DropdownState();
  }
}

  • _DropdownState

//下劃線開頭表示私有
class _DropdownState extends State<FlutterDropdownButtonStatefulWidget> {
//  下拉菜單選中的值(注意:在初始化時碗硬,要么為null瓤湘,這時顯示默認hint的值;
// 如果自己設(shè)定值恩尾,則值必須為列表中的一個值弛说,如果不在列表中,會拋出異常)
  String selectValue;

  @override
  Widget build(BuildContext context) {
    return DropdownButton(
      //要顯示的條目
      items: _getItems(),
      //默認顯示的值
      hint: Text("請選擇城市"),
      //下拉菜單選中的值(注意:在初始化時翰意,要么為null木人,這時顯示默認hint的值;
      // 如果自己設(shè)定值冀偶,則值必須為列表中的一個值醒第,如果不在列表中,會拋出異常)
      value: selectValue,
      onChanged: (itemValue) {//itemValue為選中的值
        print("itemValue=$itemValue");
        _onChanged(itemValue);
      },
    );
  }
  _onChanged(String value) {
    //更新對象的狀態(tài)
    setState(() {
      selectValue = value;
    });
  }
}
  • print log
    print log
  • 最終效果
    DropdownButton

PopupMenuButton

當菜單隱藏時进鸠,點擊并且調(diào)用onSelected時顯示一個彈出式菜單列表

FlutterPopupMenuButton.gif

PopupMenuButton({
    Key key,
//構(gòu)建彈出式列表數(shù)據(jù)
    PopupMenuItemBuilder<T> @required this.itemBuilder,
//初始值
   T initialValue,
//選中時的回調(diào)
 PopupMenuItemSelected<T> onSelected;,
//當未選中任何條目后彈窗消失時的回調(diào)
     final PopupMenuCanceled onCanceled;,
//
    this.tooltip,
//彈窗陰影高度
    this.elevation = 8.0,
//邊距
    this.padding = const EdgeInsets.all(8.0),
//彈窗的位置顯示的組件稠曼,默認為三個點...
    this.child,
//跟child效果一致
    this.icon,
//彈窗偏移位置
    this.offset = Offset.zero,
  })

  • Code

import 'package:flutter/material.dart';

class FlutterPopupMenuButton extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _PopupMenuState();
}

const List<String> models = const <String>['白天模式', '護眼模式', '黑夜模式'];

class _PopupMenuState extends State<FlutterPopupMenuButton> {
  String title = models[0];

  List<PopupMenuEntry<String>> _getItemBuilder() {
    return models
        .map((item) => PopupMenuItem<String>(
              child: Text(item),
              value: item,//value一定不能少
            ))
        .toList();
  }

  void _select(String value) {
    setState(() {
      title = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
          actions: <Widget>[
            PopupMenuButton<String>(
              onSelected: _select,
              itemBuilder: (BuildContext context) {
                return _getItemBuilder();
              },
            )
          ],
        ),
      ),
    );
  }

//  List<PopupMenuEntry> _getItemBuilder() {
//    List<PopupMenuEntry> list = List();
//    list.add(PopupMenuItem(
//      child: Text("白天模式"),
//      value: "Day",
//    ));
//    list.add(PopupMenuItem(
//      child: Text("黑夜模式"),
//      value: "Night",
//    ));
//    return list;
//  }

}

ButtonBar

水平排列的按鈕組

ButtonBar

const ButtonBar({
    Key key,
//子組件的間隔樣式
    this.alignment = MainAxisAlignment.end,
    this.mainAxisSize = MainAxisSize.max,
//子children
    this.children = const <Widget>[],
  })

MainAxisAlignment,之間的博客中講過客年。


class FlutterButtonBar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ButtonBar(children: <Widget>[
      Text("ButtonBar0"),
      Icon(Icons.ac_unit),
      Text("ButtonBar1")
    ], );
  }
}

到這里霞幅,終于把Material Style的大部分Button講完了,開始下一個量瓜。

本地代碼地址

Flutter 豆瓣客戶端司恳,誠心開源
Flutter Container
Flutter SafeArea
Flutter Row Column MainAxisAlignment Expanded
Flutter Image全解析
Flutter 常用按鈕總結(jié)
Flutter ListView豆瓣電影排行榜
Flutter Card
Flutter Navigator&Router(導(dǎo)航與路由)
OverscrollNotification不起效果引起的Flutter感悟分享
Flutter 上拉抽屜實現(xiàn)
Flutter 豆瓣客戶端,誠心開源
Flutter 更改狀態(tài)欄顏色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榔至,一起剝皮案震驚了整個濱河市抵赢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唧取,老刑警劉巖铅鲤,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枫弟,居然都是意外死亡邢享,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門淡诗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骇塘,“玉大人,你說我怎么就攤上這事韩容】钗ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵群凶,是天一觀的道長插爹。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么赠尾? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任力穗,我火速辦了婚禮,結(jié)果婚禮上气嫁,老公的妹妹穿的比我還像新娘当窗。我一直安慰自己,他們只是感情好寸宵,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布崖面。 她就那樣靜靜地躺著,像睡著了一般邓馒。 火紅的嫁衣襯著肌膚如雪嘶朱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天光酣,我揣著相機與錄音,去河邊找鬼脉课。 笑死救军,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的倘零。 我是一名探鬼主播唱遭,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呈驶!你這毒婦竟也來了拷泽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袖瞻,失蹤者是張志新(化名)和其女友劉穎司致,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聋迎,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡脂矫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霉晕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庭再。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牺堰,靈堂內(nèi)的尸體忽然破棺而出拄轻,到底是詐尸還是另有隱情,我是刑警寧澤伟葫,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布恨搓,位于F島的核電站,受9級特大地震影響扒俯,放射性物質(zhì)發(fā)生泄漏奶卓。R本人自食惡果不足惜一疯,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夺姑。 院中可真熱鬧墩邀,春花似錦、人聲如沸盏浙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽废膘。三九已至竹海,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丐黄,已是汗流浹背斋配。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灌闺,地道東北人艰争。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像桂对,于是被迫代替她去往敵國和親甩卓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫蕉斜、插件逾柿、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 9月1日早上机错,媳婦看見我慢悠悠地醒來,微笑著告訴我說诽凌,昨天晚上你睡得真好毡熏,真香!多久沒有睡這么好的覺了侣诵。整...
    水墨山風(fēng)王仲波閱讀 375評論 0 5
  • 20171002 周一 #口號(如:父母的高度是孩子的起點)# 孩子第二個30天目標: 認真吃飯痢法,多吃菜 媽媽第...
    文子16閱讀 268評論 0 0
  • 我想了很久,也不知道有多久杜顺。 終于開口告訴了她 她坐在陽光照耀下的椅子财搁,說:“你知道…這要考慮很多,而且現(xiàn)在已經(jīng)不...
    楠啊啊閱讀 199評論 0 0
  • 西冷牛排 有嚼勁 牛外脊的肉 肉的外圍有白色肉筋 勒眼牛排 q彈口感 肥瘦皆有 油畫豐富 菲力牛排 牛腹腔 肉質(zhì)鮮...
    木子型男閱讀 205評論 1 0