Flutter入门:Button

简介: IconButton如果即是一个图标又想点击,那么就用这个IconButton( icon: Icon(Icons.close), onPressed: (){ // })

IconButton


如果即是一个图标又想点击,那么就用这个


IconButton(
  icon: Icon(Icons.close),
  onPressed: (){
    //
  }
)  
复制代码


普通按钮FlatButton


这种按钮没有深度,所以没有阴影,一个例子


FlatButton(
  child: Text("去补测"),
  onPressed: (){
  },
)
复制代码


这是一个普通的按钮,无背景的。如果想添加背景,可以添加color: Colors.XXX, 如下


FlatButton(
  color: Colors.blue,
  textColor: Colors.white,
  child: Text("去补测"),
  onPressed: (){
  },
)
复制代码


这样就是一个蓝色背景白色字体的按钮。

注意如果要显示背景,必须设置onPressed,否则即使设置了color依然没有背景色显示

但是这个背景并不是圆角的(其实有一点点圆角),如果想实现圆角,则需要添加shape,如下:


FlatButton(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(10),
  ),
  color: Colors.blue,
  textColor: Colors.white,
  child: Text("去补测"),
  onPressed: (){
  },
)
复制代码


这样就添加了大小为10的圆角。但是如果我们想实现边框背景,即中间透明四周有边框的,需要修改shape如下:


FlatButton(
  shape: RoundedRectangleBorder(
    side: BorderSide(
      color: Colors.blue,
      width: 1,
    ),
    borderRadius: BorderRadius.circular(10),
  ),
  color: Colors.transparent,
  textColor: Colors.blue,
  child: Text("去补测"),
  onPressed: (){
  },
)
复制代码


注意color改成透明的了,这样就实现了边框背景,且带有圆角。


其他button


其他如MaterialButton等,有的是有阴影的,不过使用方式大致一样。


去除默认间距


在flutter中使用button组件,默认四周是有间距的,如果想去掉这个间距,直接设置padding是不够的,比如


FlatButton(
  padding: EdgeInsets.all(0),
  child: Text("1"),
  onPressed: (){
    ...
  },
),
复制代码


设置完会发现没有效果,文字四周还是有间距。这是因为全局默样式ButtonTheme导致的,影响这个间距的因素有两个。

第一个就是宽高,因为button的高度可以通过height设置,但是没有width属性,所以宽度无法设置固定。所以这里的关键就是minWidth,在ButtonTheme中的minWidth默认是88,如下


const ButtonThemeData({
    this.textTheme = ButtonTextTheme.normal,
    this.minWidth = 88.0,
    this.height = 36.0,
    EdgeInsetsGeometry padding,
    ShapeBorder shape,
    this.layoutBehavior = ButtonBarLayoutBehavior.padded,
    this.alignedDropdown = false,
    Color buttonColor,
    Color disabledColor,
    Color focusColor,
    Color hoverColor,
    Color highlightColor,
    Color splashColor,
    this.colorScheme,
    MaterialTapTargetSize materialTapTargetSize,
  })
复制代码


这个就导致了我们无论如何设置padding,宽度都不会小于88。

要改变这个值可以不用修改样式,直接通过button的minWidth属性即可,如:


FlatButton(
  minWidth: 0,  
  padding: EdgeInsets.all(0),
  child: Text("1"),
  onPressed: (){
    ...
  },
),
复制代码


修改了minWidth后再运行看效果,发现按钮宽度减少了,但是两边还有间距。这就是第二个影响因素:padding。

我们不是已经将padding设置为0了么?看一下FlatButton源码:


@override
Widget build(BuildContext context) {
  final ThemeData theme = Theme.of(context);
  final ButtonThemeData buttonTheme = ButtonTheme.of(context);
  return RawMaterialButton(
    onPressed: onPressed,
    onLongPress: onLongPress,
    onHighlightChanged: onHighlightChanged,
    mouseCursor: mouseCursor,
    fillColor: buttonTheme.getFillColor(this),
    textStyle: theme.textTheme.button.copyWith(color: buttonTheme.getTextColor(this)),
    focusColor: buttonTheme.getFocusColor(this),
    hoverColor: buttonTheme.getHoverColor(this),
    highlightColor: buttonTheme.getHighlightColor(this),
    splashColor: buttonTheme.getSplashColor(this),
    elevation: buttonTheme.getElevation(this),
    focusElevation: buttonTheme.getFocusElevation(this),
    hoverElevation: buttonTheme.getHoverElevation(this),
    highlightElevation: buttonTheme.getHighlightElevation(this),
    disabledElevation: buttonTheme.getDisabledElevation(this),
    padding: buttonTheme.getPadding(this),
    visualDensity: visualDensity ?? theme.visualDensity,
    constraints: buttonTheme.getConstraints(this).copyWith(
      minWidth: minWidth,
      minHeight: height,
    ),
    shape: buttonTheme.getShape(this),
    clipBehavior: clipBehavior,
    focusNode: focusNode,
    autofocus: autofocus,
    materialTapTargetSize: buttonTheme.getMaterialTapTargetSize(this),
    animationDuration: buttonTheme.getAnimationDuration(this),
    child: child,
  );
}
复制代码


可以看到FlatButton中又包了一层RawMaterialButton,而这个也是有padding的,是由buttonTheme的padding决定的。

所以要去掉这个padding就必须要重新设置buttonTheme,需要在button外面加一层theme,如下:


Theme(
  data: ThemeData(
    buttonTheme: ButtonThemeData(
      padding: EdgeInsets.all(0),
    ),
  ),
  child: FlatButton(
      minWidth: 0,  
      padding: EdgeInsets.all(0),
      child: Text("1"),
      onPressed: (){
        ...
      },
    ),
),  
复制代码


这样就彻底去除了按钮的间距。

注意这个样式只对这个button起作用,如果想对整个页面(或更多组件)起作用就可以放到更外层


目录
相关文章
|
存储 缓存 Dart
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
类和成员的可见性,这在基于库或包的开发中非常重要,Dart中提供了工厂构造函数,可以方便的实现单例、缓存实例对象、返回子类等,以及常量构造函数的使用......
299 0
[Flutter]足够入门的Dart语言系列之面向对象:类成员的可见性、常量和工厂构造函数详解
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
71 7
|
6月前
|
Dart 前端开发 开发工具
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
【4月更文挑战第30天】本文介绍了Flutter SDK的安装和配置过程,以及如何创建并运行第一个Flutter应用。首先确保安装了Dart SDK和Flutter SDK,支持macOS、Linux和Windows。安装完成后,设置环境变量,然后通过`flutter doctor`验证安装。接着,使用`flutter create`命令创建新项目,进入项目目录并运行`flutter run`启动应用。在`main.dart`中修改代码以自定义应用。Flutter支持热重载和DevTools调试。本文为Flutter初学者提供了快速入门的指导。
97 0
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
|
3月前
|
Dart 前端开发 JavaScript
Flutter&Dart-异步编程Future、Stream极速入门
Flutter&Dart-异步编程Future、Stream极速入门
72 4
Flutter&Dart-异步编程Future、Stream极速入门
|
3月前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes入门与实践打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第31天】云原生技术正改变着应用开发和部署的方式。本文将带你了解云原生的基石——Kubernetes,通过实际的代码示例,从安装到部署一个简单的应用,让你迅速掌握Kubernetes的核心概念和操作方法。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你进入云原生世界的桥梁。
|
4月前
|
开发框架 Dart Java
Flutter入门进阶之旅(一)-初识Flutter
Flutter 的目标是用来创建高性能、高稳定性、高帧率、低延迟的 Android 和 iOS 应用。并且开发出来的应用在不同的平台用起来跟原生应用具有一样的体验。不同的平台的原生体验应该得到保留,让该应用看起来同整个系统更加协调。不同平台的滚动操作、字体、图标 等特殊的特性 应该和该平台上的其他应用保持一致,让用户感觉就像操作原生应用一样。
59 1
|
4月前
|
Dart 搜索推荐
Flutter入门进阶之旅(二)Hello Flutter
好像几乎我们学习或者掌握任何一门编程语言都是Hello word开始的,本篇博文做为Flutter入门进阶的第一篇分享,我们也从最简单的Hello world开始,至于Flutter开发环境的配置,跟关于Dart语言的介绍,不是该专栏要讲解的内容,我就不详细做介绍了,读者可自行google或者百度了解一下。
47 0
|
5月前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
6月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
|
6月前
|
Dart 开发者
Flutter入门之Dart中的并发编程、异步和事件驱动详解
Flutter入门之Dart中的并发编程、异步和事件驱动详解 Dart是一种高效、快速、灵活且用于Web和移动应用程序开发的编程语言。在Dart中,支持并发编程、异步和事件驱动等特性,这些特性使得Dart在处理诸如网络请求、文件I/O、用户输入等方面表现出色。本文将详细介绍Dart中的这些特性。
127 0