flutter的按钮如何变为不可选中_Flutter 61: 图解基本 Button 按钮小结 (一)

Button 在日常中是必不可少的,小菜尝试过不同类型的 Button,也根据需求自定义过,今天小菜系统的学习一下最基本的 Button;

Flutter 中没有 Button Widget,但提供了很多不同类型的 Child Button Widget;小菜分析源码整体可分为 RawMaterialButton 和 IconButton 两类;

其中 RaisedButton / FlatButton / OutlineButton 继承自 MaterialButton 且 MaterialButton 是对 RawMaterialButton 的封装;而BackButton / CloseButton / PopupMenuButton 继承自 IconButton;最终 RawMaterialButton 和 IconButton 都是由 ConstrainedBox 填充绘制;

IconButton 系列

IconButton 系列属于图标按钮,使用相对简单;其核心是 InkResponse 水波纹效果;

IconButton

源码分析

const 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 // 长按提示

})

分析源码,其中 icon 和 onPressed 是必须要设置的,其余属性根据需求而适当调整;

案例尝试

小菜首先尝试最基本的 IconButton;长按会由 tooltip 提醒,点击为默认主题色;

IconButton(icon: Icon(Icons.android), tooltip: 'IconButton tootip1',

onPressed: () => Toast.show('IconButton', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM));

小菜尝试其中几个属性;其中 icon 颜色为 cyan,点击高亮背景色为 deepPurple,水波纹颜色为 redAccent;注意当 icon 自身设置颜色时 color 属性不生效;

IconButton(icon: Icon(Icons.android), tooltip: 'IconButton tootip2',

color: Colors.cyan,

highlightColor: Colors.deepPurple.withOpacity(0.4),

splashColor: Colors.redAccent,

onPressed: () => Toast.show('IconButton', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM));

小菜尝试不可点击时,icon 颜色为 disabledColor 设置的 green;同样若 icon 本身设置了颜色,disabledColor 不生效;注意:onPressed: null 与 onPressed: ()=> null 不同,前者代表无点击事件;后者代表有点击事件,只是点击无操作;

IconButton(icon: Icon(Icons.android), disabledColor: Colors.green, onPressed: null);

icon 为 Widget 采用 Icon / Image / ImageIcon 等均可;

IconButton(icon: Image.asset('images/ic_launcher.png'), iconSize: 40.0, onPressed: null);

BackButton

BackButton 作用非常明确,一般用作返回上一个页面;

源码分析

const BackButton({ Key key, this.color })

分析源码,BackButton 继承自 IconButton,只允许设置图标颜色,图标样式 Android 与 iOS 不同且不可修改;点击时会优先判断 maybePop 是否可以返回上一页;

案例尝试

BackButton();

BackButton(color: Colors.green);

CloseButton

CloseButton 一般用作导航栏关闭按钮与 BackButton 类似;

源码分析

const CloseButton({ Key key }) : super(key: key);

分析源码,CloseButton 继承自 IconButton,无需设置任何属性;点击时会优先判断 maybePop 是否可以返回上一页;

案例尝试

CloseButton();

RawMaterialButton 系列

RawMaterialButton

RawMaterialButton 是 MaterialButton 的基础,核心是由 Material 和 InkWell 等组成;但不可用当前 Theme 或 ButtonTheme 来计算未指定参数的默认值;

源码分析

const RawMaterialButton({

Key key,

@required this.onPressed,

this.onHighlightChanged, // 高亮变化的回调

this.textStyle, // 文字属性

this.fillColor, // 填充颜色

this.highlightColor, // 背景高亮颜色

this.splashColor, // 水波纹颜色

this.elevation = 2.0, // 阴影

this.highlightElevation = 8.0, // 高亮时阴影

this.disabledElevation = 0.0, // 不可点击时阴影

this.padding = EdgeInsets.zero, // 内容周围边距

this.constraints = const BoxConstraints(minWidth: 88.0, minHeight: 36.0), // 默认按钮尺寸

this.shape = const RoundedRectangleBorder(), // 形状样式

this.animationDuration = kThemeChangeDuration, // 动画效果持续时长

this.clipBehavior = Clip.none, // 抗锯齿剪切效果

MaterialTapTargetSize materialTapTargetSize, // 点击目标的最小尺寸

this.child,

})

分析源码可知,RawMaterialButton 没有设置宽高的属性,可根据 padding 或外层依赖 Container 适当调整位置和大小;默认最小尺寸为 88px * 36px;

案例尝试

小菜定义了一个基本的按钮,并监听其高亮改变时状态,与我们常见的按钮基本一致;

RawMaterialButton(

padding: EdgeInsets.all(20.0),

child: Row(mainAxisSize: MainAxisSize.min, children: [

Padding(child: Icon(Icons.android), padding: EdgeInsets.only(right: 10.0)),

Text('RawMaterialButton', style: TextStyle(color: Colors.brown))

]),

textStyle: TextStyle(color: Colors.pink, fontSize: 18.0),

fillColor: Colors.greenAccent.withOpacity(0.4),

highlightColor: Colors.cyan,

splashColor: Colors.deepPurple.withOpacity(0.4),

onPressed: () => Toast.show('RawMaterialButton', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM),

onHighlightChanged: (state) => Toast.show('onHighlightChanged -> $state', context, duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER))

FloatingActionButton

FloatingActionButton 是 RawMaterialButton 的封装,主要用于浮动在屏幕内容之上,一般是位于底部左右角或中间;一般一个页面只有一个;

源码分析

const FloatingActionButton({

Key key,

this.child,

this.tooltip, // 长按提醒

this.foregroundColor, // 按钮上子元素颜色

this.backgroundColor, // 背景色

this.heroTag = const _DefaultHeroTag(), // Hero 动画标签

this.elevation = 6.0, // 阴影

this.highlightElevation = 12.0, // 高亮时阴影

@required this.onPressed,

this.mini = false, // 尺寸大小,分为 mini 和 default

this.shape = const CircleBorder(), // 样式形状

this.clipBehavior = Clip.none, // 抗锯齿剪切效果

this.materialTapTargetSize, // 点击目标的最小尺寸

this.isExtended = false, // 是否采用 .extended 方式

})

案例尝试

小菜尝试一个基本的 FloatingActionButton;长按会有 tooltip 提示;

floatingActionButton: FloatingActionButton(child: Icon(Icons.android), tooltip: 'FloatingActionButton ToolTip',

onPressed: () => Toast.show('FloatingActionButton', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM));

foregroundColor 为按钮上层子元素颜色,若子元素本身设置颜色则不生效;backgroundColor 为按钮背景色;

foregroundColor: Colors.redAccent.withOpacity(0.7),

backgroundColor: Colors.green.withOpacity(0.4),

elevation 按钮默认阴影高度,即 z轴高度;highlightElevation 为点击高亮时阴影高度;

elevation: 0.0,

highlightElevation: 10.0,

mini 是否展示成小尺寸模式;materialTapTargetSize 为配置目标的最小点击尺寸,padded 为默认的 48px * 48px 为 Android 推荐尺寸;shrinkWrap 为缩小到 Material 提供的最小尺寸;

mini: true,

materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,

shape 为样式尺寸;clipBehavior 为抗锯齿效果;

shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(14.0))),

clipBehavior: Clip.antiAlias,

heroTag 动画标签,默认的是 FloatingActionButtonAnimator.scaling;且 heroTag 默认是相同的,可以自定义为唯一标签;小菜设置上一页面与当前页面 FloatingActionButton 的 heroTag 相同;

floatingActionButtonAnimator: MyAnimation(),

heroTag: "aceTag",

class MyAnimation extends FloatingActionButtonAnimator {

double _x, _y;

@override

Offset getOffset({Offset begin, Offset end, double progress}) {

_x = begin.dx + (end.dx - begin.dx) * progress;

_y = begin.dy + (end.dy - begin.dy) * progress;

return Offset(_x * 0.5, _y * 0.9);

}

@override

Animation getRotationAnimation({Animation parent}) {

return Tween(begin: 1.0, end: 1.0).animate(parent);

}

@override

Animation getScaleAnimation({Animation parent}) {

return Tween(begin: 1.0, end: 1.0).animate(parent);

}

}

FloatingActionButton 提供了 .extended 方式创建代表标签样式的,非正方形的按钮样式;其余属性无差;

floatingActionButton: FloatingActionButton.extended(

onPressed: () => Toast.show('FloatingActionButton.extended', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM),

icon: Icon(Icons.android),

label: Text('Android'));

针对特殊的个性化,FloatingActionButton 展示的大小可能会有所不同;小菜尝试了几种方式;

a. 通过最基本的 RawMaterialButton 实现 FloatingActionButton 样式,外层添加 Container 约束大小;小菜比较推荐方式一,灵活性更高;

// 方式一

floatingActionButton: Container(

width: 100.0, height: 100.0,

color: Colors.greenAccent.withOpacity(0.4),

child: RawMaterialButton(

shape: CircleBorder(),

elevation: 0.0,

child: Icon(Icons.android),

onPressed: () {}))

b. 借助 FittedBox 将按钮整体放大到 Container 约束范围内;

// 方式二

floatingActionButton: Container(

width: 100.0, height: 100.0,

child: FittedBox(

child: FloatingActionButton(child: Icon(Icons.android), onPressed: () {})))

c. SizeBox 与 FittedBox 约束方式不同,只是整体范围变大,其内部按钮按 Material 建议样式展示;

// 方式三

floatingActionButton: SizedBox(

width: 100.0, height: 100.0,

child: FloatingActionButton(child: Icon(Icons.android), onPressed: () {}))

d. scale 与 FittedBox 类似,按比例缩放;

// 方式四

floatingActionButton: Transform.scale(

scale: 1.5,

child: FloatingActionButton(child: Icon(Icons.android), onPressed: () {}))

Button 涉及的内容较多,扩展性很强,小菜分两节进行学习尝试;有些理解可能还不到位,有问题请多多指导!

来源: 阿策小和尚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

l2-008 最长对称子串 (25分)_小学数学关于时间认识(时、分、秒)的几点总结

本文将通过对照学习一个个知识点,延伸出各种知识点的常用题型。一、时、分、秒之间的换算:1时60分 1分60秒这类题型考的是时间单位之间的换算,一种是大单位换小单位,一种是小单位换大单位。在之前的一篇文章里有关于换算的计算方法…

java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字

ssm(Oracle)配置druid数据库连接池,正常启动项目,但是请求访问数据库时报错“java.sql.SQLSyntaxErrorException: ORA-00923: 未找到要求的 FROM 关键字”原因:jdbc配置 validationQuery:SELECT 1这是mysql的写法,oracle应改为 va…

linux中退格出现乱码,SSH中的SQL命令按退格键出现乱码的问题解决

用SSH调用SQLPLUS输入SQL语句,按backspace(退格键)出现 ^H的乱码如下所示:[oracleeven ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Fri Jun 6 00:09:23 2014Copyright (c) 1982, 2005, Oracle. All rights reserved.Connect…

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网页等,实现 UI 自动…

如何在阿里云上构建一个合适的Kubernetes集群

摘要: 声明 本文主要介绍如何在阿里云上构建一个K8S集群的实践,只是作为参考,大家可以根据实际情况做出调整。 集群规划 在实际案例中发现,有不少同学使用了很多的小规格的ECS来构建K8S集群,这样其实即没有达到省钱的目…

Could not load oracle/sql/converter_xcharset/lx20354.glb.

将WebRoot\WEB-INF\lib下的mysql-connector-java-5.1.7-bin.jar或者ojdbc14.jar剪贴 到Tomcat 6.0\lib下,移至Tomcat 6.0\lib下。

dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告

在织梦dedecms的网站上添加漂浮广告其实很简单,这篇文章主要讲的是在织梦网站首页添加漂浮广告。我们用本地搭建的织梦默认模板演示。1、准备一个广告图片准备一个广告图片,命名为漂浮.gif ,设置好图片大小150*150 ,之后把图片放到…

360断网急救箱_万事不求人,教你自己动手修复网络断网

日常使用中,我们经常会遇到原来好好的网络忽然无法上网的问题。在排除宽带没有问题,硬件交换机、路由器、网线没有问题的情况下,我们可以充分利用第三方工具的修复功能。前几天,我就遇到一例电脑不能上网的问题,同一办…

linux 网络dma驱动,S3C2410的Linux下DMA驱动程序开发

网上介绍Linux下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接手时无资料借鉴的茫然&…

如何开启MySQL慢查询日志

摘要: 前言 数据库日志记录了用户对数据库的各种操作及数据库发生的各种事件。能帮助数据库管理员追踪、分析问题。MySQL提供了错误日志、二进制日志、查询日志、慢查询日志。 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超…

Pivotal冯雷:以数字化为核心竞争力的时代 自主可控是企业的“必然选择”

戳蓝字“CSDN云计算”关注我们哦!随着互联网的飞速发展,特别是近年来随着社交网络、物联网、云计算以及多种传感器的广泛应用,以数量庞大,种类众多,时效性强为特征的非结构化数据不断涌现,数据的重要性愈发…

druid去掉广告

定位问题 产生广告的JS文件在 druid-1.1.19.jar/support/http/resources/js/common.js。 查看源码可知是buildFooter方法进行植入,由init方法调用。 解决方案: 找到对应的依赖jar包,如druid-1.1.19.jar 找到support/http/resource/js/comm…

阿里巴巴的AI算法程序媛是怎样的一种存在?

摘要: 一个专注人脸识别技术长达11年的程序媛。程序媛、AI、算法、人脸识别、阿里安全图灵实验室……这些标签任何一个都极具话题性,但如果一个女子同时拥有这些标签,那会是怎样的存在?在见到于鲲之前,我的脑子里是各种…

Hadoop 中zoo_数据分析中的Excel、R、Python、SPSS、SAS和SQL

作为一直想入门数据分析的童鞋们来说,如何选定一门面向数据分析的编程语言或工具呢?注意是数据分析,而不是大数据哦,数据分析是基础了。数据分析的工具千万种,综合起来万变不离其宗。无非是数据获取、数据存储、数据管…

linux下装sqlserver安装包,【sqlServer】CentOS7.x 上Microsoft SQL Server for Linux安装和配置...

SQL Server Documentationhttps://docs.microsoft.com/en-us/sql/sql-server/sql-server-technical-documentation?viewsql-server-2017Installation guidance for SQL Server on Linuxhttps://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup?viewsql-server-20…

2019云栖大会:逍遥看巅峰,张勇提“百新”,平头哥“再亮剑”

文 | 阿晶、丹丹、王银发于阿里云栖大会现场 出品 | CSDN云计算(ID:CSDNcloud) “今天不是马云的退休,而是制度传承的开始。”9月10日,阿里20周年的大日子,逍遥子接棒风清扬,跟唱《追梦赤子心》…

10行代码让你轻松搞定对象检测

摘要: 十行代码轻松搞定对象检测?快来看看如何使用ImageAI。计算机视觉是人工智能领域中最重要的一个分支。计算机视觉是一门能够识别和理解图像及其场景的计算机软件系统的科学。计算机视觉包括图像识别、对象检测、图像生成、图像超分辨率等多个方面。…

项目集成Flowable工作流

企业级项目集成Flowable工作流,基于(师父)的开源项目的集成,此开源项目是师傅十几年的经验和实战总结而成,直接可以用于企业开发,旨为帮助更多需要帮助的人! 说明链接项目开原地址https://gitee.com/lwj/flowable博客链接https://…

shell softech 面料_求高人指点 猛犸象的SOFTECH面料和GTX PROSHELL面料哪个好

曾经看到一个帖子 关于 MAMMUT 对 SOFTECH的解释,找出来希望对 LZ 有所借鉴。作者L.HO为 我很佩服的一个 业内人士,从业于MAMMUT 公司。 转帖 再次声明 转帖,同时 希望对 MAMMUT 有所偏好的 可以作为借鉴和资料。1) softech & drytech的…

这个阿里程序员,干了件很轴的事儿

摘要: 我叫孤尽,是一名阿里程序员。 如果说,我身上有一点点和普通程序员不一样,也许是更轴一点。比如我觉得JAVA是世界上最好的语言,没有之一。 最近,我又干了一件比较轴的事情。 我因为这件事曾被大家群嘲…