携手创作,一同成长!这是我参与「日新方案 8 月更文挑战」的第6天,点击查看活动概况

前言

很高兴遇见你~

在本系列的上一篇文章中,咱们经过:作用展现 -> Widget 介绍 -> 代码完成的办法对 Image,ListView,GridView,Stack 进行了介绍,并交叉讲解了一些其它 Widget ,最终经过一个归纳事例对学习的 Widget 进行了组合运用。还没有看过上一篇文章的朋友,主张先去阅览 Flutter 系列(四):Flutter 常用 Widget 二。接下来咱们对 Flutter 按钮 Widget 进行学习

Flutter 中的按钮 Widget 有很多,常见的按钮 Widget 有:RaisedButton,FlatButton,IconButton,OutlineButton,ButtonBar,FloatingActionButton 等,下面就介绍一下这些常用的 Widget

一、Flutter 常用按钮 Widget 介绍

1.1、Flutter 按钮 Widget 通用特点

首先介绍一下,按钮 Widget 都有的一些特点:

特点称号 特点类型 阐明
onPressed VoidCallback 此项为必填参数,按下按钮时触发的回调,接纳一个办法作为参数,传 null 表明按钮禁用,会显现禁用相关款式
child Widget 子控件,一般咱们会运用文本 Widget 来填充
textColor Color 文本色彩
color Color 按钮布景色彩
disabledColor Color 按钮禁用时的布景色彩
disabledTextColor Color 按钮禁用时的文本色彩
splashColor Color 点击按钮时的水波纹色彩
highlightColor Color 长按按钮后按钮的布景色彩
elevation double 按钮暗影的规模,值越大暗影规模越大
padding EdgeInsetsGeometry 內边距
shape ShapeBorder 设置按钮的形状,ShapeBorder 完成类有:
RoundedRectangleBorder:圆角形状
CircleBorder:圆形形状

介绍完了按钮 Widget 的通用特点,接下来咱们看下每个按钮初始形态的一个作用,在结合这些按钮做一个归纳事例

1.2、RaisedButton

RaisedButton 见名知意:凸起的按钮,其实就是 Flutter 给咱们提供的 Material Design 风格的按钮:

运行如下代码:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Button Widget"), //设置标题栏标题
        ),
        body: MyBodyPage() //自界说 Widget
    ),
  ));
}
class MyBodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //运用 ListView 让按钮自适应屏幕宽度
    return ListView(
      //内距离 20
      padding: EdgeInsets.all(20),
      children: [
        //RaisedButton 凸起按钮
        RaisedButton(
          onPressed:(){},
          child: Text("RaisedButton"),
        )
      ],
    );
  }
}

作用展现:

Flutter 系列(五):Flutter 常用按钮 Widget

默认情况下是一个灰色布景的凸起按钮

1.3、FlatButton

FlatButton 见名知意:扁平的按钮,和 RaiseButton 刚好相反,没有凸起的作用。将上述 RaiseButton 换成 FlatButton 作用如下:

Flutter 系列(五):Flutter 常用按钮 Widget

能够看到,它没有布景,就像一个文本 Widget 相同

1.4、OutlineButton

OutlineButton 见名知意:带线框的按钮,它就像是 FlatButton 加了一个边框。将上述 RaiseButton 换成 OutlineButton 作用如下:

Flutter 系列(五):Flutter 常用按钮 Widget

1.5、IconButton

IconButton 见名知意:带 Icon 的按钮。将上述 RaiseButton 换成 IconButton 并做特点的调整:

IconButton(
   icon: Icon(Icons.home),
   onPressed:(){},
)

作用如下:

Flutter 系列(五):Flutter 常用按钮 Widget

1.6、ButtonBar

ButtonBar 是一个按钮组,咱们能够在它的 children 特点中放入多个按钮,如下代码:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Button Widget"), //设置标题栏标题
        ),
        body: MyBodyPage() //自界说 Widget
    ),
  ));
}
class MyBodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ButtonBar(
      //按钮组
      children: [
        RaisedButton( //RaisedButton
          onPressed: () {},
          child: Text("RaisedButton"),
        ),
        FlatButton( //FlatButton
          onPressed: () {},
          child: Text("FlatButton"),
        ),
        OutlineButton( //OutlineButton
          onPressed: () {},
          child: Text("OutlineButton"),
        ),
        IconButton( //IconButton
          icon: Icon(Icons.home),
          onPressed: () {},
        )
      ],
    );
  }
}

作用:

Flutter 系列(五):Flutter 常用按钮 Widget

1.7、FloatingActionButton

FloatingActionButton 简称 FAB,能够完成起浮按钮。它常用的一些特点:

特点称号 特点类型 阐明
onPressed VoidCallback 此项为必填参数,按下按钮时触发的回调,接纳一个办法作为参数,传 null 表明按钮禁用,会显现禁用相关款式
child Widget 子控件,一般为 Icon,不引荐运用文字
backgroundColor Color 布景色彩
elevation double 未点击时分的暗影
highlightElevation double 点击时的暗影值,默认为:12.0
shape ShapeBorder 界说 FAB 的形状
mini bool 是否是 mini 类型,默认为:false

如下代码:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Button Widget"), //设置标题栏标题
        ),
        body: MyBodyPage() //自界说 Widget
    ),
  ));
}
class MyBodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: EdgeInsets.all(20),
      children: [
        FloatingActionButton( //FloatingActionButton 按钮
          onPressed: (){},
          child: Icon(Icons.search),
          backgroundColor: Colors.lightGreen,
          elevation: 20,
        )
      ],
    );
  }
}

作用:

Flutter 系列(五):Flutter 常用按钮 Widget

二、Flutter 2.x 按钮 Widget 的改变

如果你是 Flutter 2.x 的版别,你会发现之前的一些按钮 Widget 被抛弃了:

Flutter 系列(五):Flutter 常用按钮 Widget

主要是上面这三个按钮的改变,取而代之的是:

Flutter 1.x 中的按钮 Widget Flutter 2.x 中的按钮 Widget
RaisedButton 凸起按钮 ElevatedButton 凸起按钮
FlatButton 扁平按钮 TextButton 扁平按钮
OutlinedButton 线框按钮 OutlinedButton 线框按钮

另外在 1.x 中设置的一系列特点,如:color,textColor,elevation,shape等在 2.x 中都被封装到了 style 特点中,style 特点接纳一个 ButtonStyle 类型的对象,介绍一下 ButtonStyle 中的常用特点:

特点称号 特点类型 阐明
textStyle MaterialStateProperty 文本的款式 可是对于色彩是不起作用的
backgroundColor MaterialStateProperty 按钮布景色
foregroundColor MaterialStateProperty 文本及图标色彩
overlayColor MaterialStateProperty 高亮色,按钮处于 focused,hovered or pressed 时的色彩
shadowColor MaterialStateProperty 暗影色彩
elevation MaterialStateProperty 按钮暗影的规模,值越大暗影规模越大
padding MaterialStateProperty 按钮内边距
minimumSize MaterialStateProperty 按钮最小值
fixedSize MaterialStateProperty 按钮巨细
maximumSize MaterialStateProperty 按钮最大值
side MaterialStateProperty 边框
shape MaterialStateProperty 设置按钮的形状
alignment AlignmentGeometry 按钮子 Widget 对齐办法

实践比照:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Button Widget"), //设置标题栏标题
        ),
        body: MyBodyPage() //自界说 Widget
    ),
  ));
}
class MyBodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: EdgeInsets.all(20),
      children: [
        RaisedButton( //RaisedButton
          onPressed: (){},
          child: Text("RaisedButton"),
          textColor: Colors.white, //文本色彩
          color: Colors.green, //按钮布景色彩
          splashColor: Colors.red, //水波纹色彩
          elevation: 20, //暗影的规模
          shape: RoundedRectangleBorder( //设置 20 的圆角
            borderRadius: BorderRadius.circular(20)
          )
        ),
        SizedBox(height: 40),
        ElevatedButton( //ElevatedButton
            onPressed: (){},
            child: Text("ElevatedButton"),
            style: ButtonStyle(
              foregroundColor: MaterialStateProperty.all(Colors.white), //文本色彩
              backgroundColor: MaterialStateProperty.all(Colors.green), //按钮布景色彩
              overlayColor: MaterialStateProperty.all(Colors.red), //水波纹色彩
              elevation: MaterialStateProperty.all(20), //暗影的规模
              shape: MaterialStateProperty.all(//设置 20 的圆角
                  RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(20)
                  )
              )
            ),
        )
      ],
    );
  }
}

作用:

Flutter 系列(五):Flutter 常用按钮 Widget

三、按钮 Widget 组合之归纳事例

在讲归纳事例之前咱们先学习下 BottomNavigationBar ,一会会用到

3.1、BottomNavigationBar 介绍

BottomNavigationBar 是 Flutter 给咱们提供的底部导航栏 Widget,一般用在 Scaffold 的 bottomNavigationBar 特点中

BottomNavigationBar 常用特点介绍:

特点称号 特点类型 阐明
items List 必须特点,最少要有两个子 Widget
onTap ValueChanged Widget 点击事情
currentIndex int 当时显现的是哪个 Widget
elevation double 暗影规模
type BottomNavigationBarType BottomNavigationBarType.fixed:固定
BottomNavigationBarType.shifting:可滑动
fixedColor Color 相当于 selectedItemColor,可是不能跟 selectedItemColor 同时存在
backgroundColor Color 布景色彩
iconSize double 设置图标巨细
selectedItemColor Color 设置 Widget 选中的色彩
unselectedItemColor Color 设置 Widget 未选中的色彩
selectedFontSize double 设置 Widget 选中时文字的巨细
unselectedFontSize double 设置 Widget 未选中时文字的巨细

运行下面代码:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
        appBar: AppBar(
          title: Text("Flutter Button Widget"), //设置标题栏标题
        ),
        bottomNavigationBar: MyBottomNavigationBar(),
    ),
  ));
}
class MyBottomNavigationBar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BottomNavigationBar(
        iconSize: 35, //图标巨细 35
        fixedColor: Colors.green, //图片色彩绿色
        type: BottomNavigationBarType.fixed, //item 固定显现
        items: [ //设置了 3 个 子 item
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "主页"),
          BottomNavigationBarItem(icon: Icon(Icons.category), label: "分类"),
          BottomNavigationBarItem(icon: Icon(Icons.settings), label: "设置")
        ]);
  }
}

作用:

Flutter 系列(五):Flutter 常用按钮 Widget

3.2、归纳事例

接下来咱们就运用按钮 Widget 组合来完成如下作用:

Flutter 系列(五):Flutter 常用按钮 Widget

简单的剖析下这个页面:最外层有个内距离(Padding),接下来就是一个从上往下排列的笔直布局(Column),笔直布局里面有一系列运用 button 完成的按钮,简单起见,咱们这儿运用 Flutter 1.x 系列的 Button 去完成,最终底部有一个 BottomNavigationBar,BottomNavigationBar 中心有一个凸起的 FloatingActionButton,相似咸鱼中心发布按钮的作用。

接下来,咱们就用代码完成一下:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: Text("Flutter Button Practice"), //设置标题栏标题
      ),
      body: MyBodyPage(), //自界说 body Wdiget
      bottomNavigationBar: MyBottomNavigationBar(), //自界说 bottomNavigationBar Widget
      floatingActionButton: MyFloatingActionButton(), //自界说 floatingActionButton Widget
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, //floatingActionButton 在底部中心停靠
    ),
  ));
}
//自界说 BottomNavigationBar
class MyBottomNavigationBar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BottomNavigationBar(
        iconSize: 35, //图标巨细 35
        fixedColor: Colors.green, //选中色彩为绿色
        type: BottomNavigationBarType.fixed, //item 固定显现
        items: [ //设置了 3 个 子 item
          BottomNavigationBarItem(icon: Icon(Icons.home), label: "主页"),
          BottomNavigationBarItem(icon: Icon(Icons.category), label: "分类"),
          BottomNavigationBarItem(icon: Icon(Icons.settings), label: "设置")
        ]);
  }
}
//自界说 FloatingActionButton
class MyFloatingActionButton extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    //运用 Container 包裹 FloatingActionButton 在外层加一个白色的边框
    return  Container(
      width: 80,
      height: 80,
      padding: EdgeInsets.all(8),
      decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.circular(40)
      ),
      child: FloatingActionButton(
        backgroundColor: Colors.yellow,
        onPressed: (){},
        child: Icon(Icons.add),
      ),
    );
  }
}
class MyBodyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Padding(//Padding 完成内距离 20
      padding: EdgeInsets.all(20),
      child: Column(
        children: [
          Row( //第一排:一般按钮 + 赤色按钮 + 带暗影的按钮
            children: [
              RaisedButton(
                onPressed: (){},
                child: Text("一般按钮"),
              ),
              SizedBox(width: 20),
              RaisedButton(
                onPressed: (){},
                child: Text("赤色按钮"),
                color: Colors.red,
                textColor: Colors.white,
              ),
              SizedBox(width: 20),
              RaisedButton(
                onPressed: (){},
                child: Text("带暗影的按钮"),
                color: Colors.blue,
                textColor: Colors.white,
                elevation: 20,
              )
            ],
          ),
          SizedBox(height: 20),
          Container( //第二排:自适应按钮
            height: 60,
            width: double.infinity,
            child: RaisedButton(
              onPressed: () {},
              child: Text("自适应按钮"),
              textColor: Colors.white,
              color: Colors.blue,
            ),
          ),
          SizedBox(height: 20),
          Row(children: [ //第三排:icon 按钮 + 有宽高的按钮
            RaisedButton.icon(
              onPressed: (){},
              icon: Icon(Icons.home),
              label: Text(" Icon 按钮"),
              color: Colors.yellow,
              textColor: Colors.green,
            ),
            SizedBox(width: 20),
            Container(
              height: 60,
              width: 200,
              child: RaisedButton(
                onPressed: () {},
                child: Text("有宽高的按钮"),
                textColor: Colors.white,
                color: Colors.orange,
              ),
            )
          ]),
          SizedBox(height: 20),
          Container( //第四排:自适应带圆角的按钮
            height: 60,
            width: double.infinity,
            child: RaisedButton(
              onPressed: () {},
              child: Text("自适应带圆角的按钮"),
              textColor: Colors.white,
              color: Colors.blue,
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(100)
              ),
            ),
          ),
          SizedBox(height: 20),
          Container( //第五排:圆形按钮
            height: 100,
            width: 150,
            child: RaisedButton(
              onPressed: () {},
              child: Text('圆形按钮'),
              textColor: Colors.white,
              color: Colors.lightGreen,
              elevation: 20,
              splashColor: Colors.green,
              shape: CircleBorder(side: BorderSide(color: Colors.white)),
            ),
          ),
          SizedBox(height: 20),
          Container( //第六排:注册按钮
            width: double.infinity,
            height: 50,
            margin: EdgeInsets.fromLTRB(20, 0, 20, 0),
            child:  OutlineButton(
              child: Text("注册"),
              onPressed: (){},
              borderSide: BorderSide(
                  width: 1,
                  color: Colors.red
              ),
            ),
          ),
          SizedBox(height: 20),
          Container( //第七排:登陆按钮
            width: double.infinity,
            height: 50,
            margin: EdgeInsets.fromLTRB(20, 0, 20, 0),
            child:  RaisedButton(
              child: Text("登陆"),
              onPressed: (){},
              color: Colors.blue,
              textColor: Colors.white,
            ),
          )
        ],
      ),
    );
  }
}

四、总结

本篇咱们讲了:

1、Flutter 中常用的按钮 Widget :RaisedButton,FlatButton,IconButton,OutlineButton,ButtonBar,FloatingActionButton

2、介绍了 Flutter 1.x 和 Flutter 2.x 按钮相关的改变及运用

Flutter 2.x 中常用的特点都被封装到了 style 特点中

3、介绍了 BottomNavigationBar,并经过 Flutter 1.x 相关 Button + BottomNavigationBar + FloatingActionButton 完成了一个归纳事例

好了,本篇文章到这儿就完毕了,希望能给你带来协助

感谢你阅览这篇文章

下篇预告

下篇文章我会介绍 Flutter 表单相关 Widget ,尽请期待吧

参阅和引荐

Flutter 教程:通俗易懂的 Flutter 入门教程

你的点赞,评论,是对我巨大的鼓励!

欢迎关注我的大众号: sweetying ,文章更新可第一时间收到

如果有问题,大众号内有加我微信的进口,在技能学习、个人成长的道路上,咱们一同行进!