Flutter - Button样式及参数

news2024/11/18 5:51:29

Material 组件库中提供了多种按钮组件如ElevatedButtonTextButtonOutlineButton等,它们都是集成于ButtonStyleButton,所以他们大多数属性都和ButtonStyleButton一样。在介绍各个按钮时我们先介绍其默认外观,而按钮的外观大都可以通过属性来自定义,我们在后面统一介绍这些属性。另外,所有 Material 库中的按钮都有如下相同点:

  1. 按下时都会有“水波动画”(又称“涟漪动画”,就是点击时按钮上会出现水波扩散的动画)。
  2. 有一个onPressed属性来设置点击回调,当按钮按下时会执行该回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

ElevatedButton

 ElevatedButton(onPressed: (){}, child: const Text("ElevatedButton")),

在这里插入图片描述

TextButton

 TextButton(onPressed: (){}, child: const Text("TextButton")),

在这里插入图片描述

OutlinedButton

  OutlinedButton(onPressed: (){}, child: const Text("OutlinedButton")),

在这里插入图片描述

IconButton

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

在这里插入图片描述

Button 的 属性 以ElevatedButton为例

const ElevatedButton({
 super.key,
 required super.onPressed,  // 单击事件
 super.onLongPress,         // 长按事件
 super.onHover,             // 鼠标滑入
 super.onFocusChange,       // 焦点
 super.style,               // 样式   ButtonStyle  或  ElevatedButton.styleFrom
 super.focusNode,           //
 super.autofocus = false,   //
 super.clipBehavior = Clip.none,   //
 super.statesController,    //
 required super.child,      //  可以放置 Widget
 });

ButtonStyle styleFrom

static ButtonStyle styleFrom({
        Color? foregroundColor,  // 前景色(文本颜色)
        Color? backgroundColor,  // 背景色
        //onPressed: null,  onLongPress: null, 两个都等于null时 表示禁用button
        Color? disabledForegroundColor, // 禁用时前景色(文本颜色)
        Color? disabledBackgroundColor,// 禁用时背景色
        Color? shadowColor,  // 阴影色
        Color? surfaceTintColor, // 表面色调颜色 有关详细信息,请参见[Material.surfaceTintColor]。
        double? elevation,       // 模拟物理深度	就是阴影浅重
        TextStyle? textStyle,    // 文本样式  TextStyle
        EdgeInsetsGeometry? padding,  // 内容边距
        Size? minimumSize,      // 最小尺寸
        Size? fixedSize,        // 按钮尺寸
        Size? maximumSize,      // 最大尺寸
       

BorderSide

 BorderSide? side,       // 边框样式
                  const BorderSide(
                      width: 2,   // 粗细
                      color: Colors.blue,  颜色
                      style: BorderStyle.solid,  // BorderStyle.solid 实线     BorderStyle.none  // 没有线
                      strokeAlign:  StrokeAlign.inside  //     inside, 边框在内部   center,  边框在中间,一半一半    outside,边框在外部
                  )
        

OutlinedBorder

OutlinedBorder? shape,  // 按钮形状

        //   shape1   一个 有楞有角的shape
        //   -----------------------
        //   BeveledRectangleBorder(
        //       borderRadius: BorderRadius.circular(20.0),
        //       side:  BorderSide(
        //                 style: BorderStyle.none,
        //              )
        //    )
        //   -----------------------

        //   shape2   一个 圆形的shape
        //   -----------------------
        //      const CircleBorder(
        //        side: BorderSide(
        //            //设置 界面效果
        //            color: Colors.brown,
        //            width: 3.0,
        //            style: BorderStyle.solid,
        //            ),
        //        ),
        //      )
        //   -----------------------

        //   shape3   一个 类似足球场的shape  圆角不能调 ,最大圆角显示
        //   -----------------------
        //    StadiumBorder(side: BorderSide(
        //         style: BorderStyle.solid,
        //         color: Color(0xffFF7F24),
        //    )),
        //   -----------------------

        //   shape4   一个 可调节圆角大小的shape
        //   -----------------------
        //    RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0))
        //   -----------------------

        

其余一些属性

MouseCursor? enabledMouseCursor,  //桌面端鼠标样式
        MouseCursor? disabledMouseCursor, //禁用时桌面端鼠标样式
        VisualDensity? visualDensity,     //视觉密度
        MaterialTapTargetSize? tapTargetSize,  // 响应触摸的区域
        Duration? animationDuration,  //[shape][elevation]的动画更改的持续时间。
        bool? enableFeedback,   //是否启用反馈,如长按震动
        AlignmentGeometry? alignment,  // 子组件区域中对齐方式
        InteractiveInkFeatureFactory? splashFactory,  	  NoSplash.splashFactory, // 没有水波纹效果
        @Deprecated(
        'Use backgroundColor instead. '
        'This feature was deprecated after v3.1.0.'
        )
        Color? primary,
        @Deprecated(
        'Use foregroundColor instead. '
        'This feature was deprecated after v3.1.0.'
        )
        Color? onPrimary,
        @Deprecated(
        'Use disabledForegroundColor and disabledBackgroundColor instead. '
        'This feature was deprecated after v3.1.0.'
        )
        Color? onSurface,
        })

设置 button的属性
方法1 style: ElevatedButton.styleFrom
在这里插入图片描述
禁用时的显示 点击事件为null 时 就是禁用状态
在这里插入图片描述

ElevatedButton(
                child: const Text("normal"),
                style: ElevatedButton.styleFrom(
                  // splashFactory: NoSplash.splashFactory, // 没有水波纹效果
                  backgroundColor: const Color(0xff000000),  // 背景黑色
                  foregroundColor: const Color(0xffffffff),  // 文字白色
                  disabledForegroundColor: const Color(0xffffff00),  // 禁用时前景色
                  disabledBackgroundColor: const Color(0xff1100ff),//禁用时 背景色
                  shadowColor:const Color(0xffff0000),//阴影颜色
                  elevation: 20, //阴影高度
                  maximumSize: const Size(2000, 100),//最大尺寸
                  textStyle: const TextStyle(
                    fontSize: 40 // 文字大小
                  ),
                  padding: const EdgeInsets.only( // 边距
                    left: 20.0,top: 10.0, right: 20.0,bottom: 10.0 
                  ),
                  side: const BorderSide(  //边框
                    width: 2,
                    color: Colors.blue,
                    style: BorderStyle.none,
                    strokeAlign:  StrokeAlign.inside  //
                  ),
                  // shape:  RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)) // 可调节圆角的shape
                  shape:BeveledRectangleBorder(  // 棱形shape
                      borderRadius: BorderRadius.circular(20.0),
                      side: const BorderSide(
                        style: BorderStyle.none,
                  )),

                ),
                onPressed: (){}, // 为null 时 显示为蓝色的图
                // onLongPress: null, // 长按事件
              ),

方法2 MaterialStatePropertyAll , MaterialStateProperty.resolveWith
在这里插入图片描述

ElevatedButton(
                    child:  const Text("normal"),
                    style:  ButtonStyle(
                      backgroundColor: MaterialStatePropertyAll<Color>(Colors.green),
                      fixedSize: const  MaterialStatePropertyAll<Size>(Size(100,100)),
                      foregroundColor: MaterialStateProperty.resolveWith((states) {
                        return states.contains(MaterialState.pressed)
                            ? Colors.blue
                            : Colors.red;
                      }),
                      shape: MaterialStateProperty.all(
                         const CircleBorder(  // 圆形shape 
                          side: BorderSide(
                              //设置 界面效果
                              color: Colors.brown,
                              width: 3.0,
                              style: BorderStyle.solid,
                              ),
                          ),
                        )
                    ),
                    onPressed: () {},
                  ),

在这里插入图片描述

 TextButton(
                    child:  const Text("normal"),
                    onPressed: () {},
                    style: const ButtonStyle(
                        shape: MaterialStatePropertyAll<OutlinedBorder>(
                          StadiumBorder(side: BorderSide(
                            style: BorderStyle.solid,
                            color: Color(0xffFF7F24),
                          )),
                        )
                    ),
                  ),

MaterialStateProperty

在 MaterialStateProperty 里有一个 MaterialState 枚举,它主要包含了
在这里插入图片描述

disabled:当控件或元素不能交互性时
hovered:鼠标交互悬停时
focused: 在键盘交互中突出显示
selected:例如 check box 的选定状态
pressed:通过鼠标、键盘或者触摸等方法发起的轻击或点击
dragged:用户长按并移动控件时
error:错误状态下,比如 TextField 的 Error

  static MaterialStateProperty<T> resolveWith<T>(MaterialPropertyResolver<T> callback) => _MaterialStatePropertyWith<T>(callback);

style: ButtonStyle(
    backgroundColor: MaterialStateProperty.resolveWith((states) {
    if (states.contains(MaterialState.pressed)) {
      return Colors.red;
    }
    return Colors.blue;
  })),
  static MaterialStateProperty<T> all<T>(T value) => MaterialStatePropertyAll<T>(value);

elevation: MaterialStateProperty.all(20),

MaterialStatePropertyAll
在这里插入图片描述

backgroundColor: MaterialStatePropertyAll<Color>(Colors.green),
fixedSize: const  MaterialStatePropertyAll<Size>(Size(100,100)),

其他的方式没怎么研究

其余样式button样式
在这里插入图片描述

Row(
                mainAxisSize: MainAxisSize.max,
                children:  <Widget>[
                  OutlinedButton(
                    child:  const Text("RoundedRectangleBorder"),
                    style: OutlinedButton.styleFrom(
                      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0))
                    ),
                    onPressed: () {
                      print("点击了按钮");
                    },
                  ),
                  IconButton(
                    icon: const Icon(Icons.thumb_up),
                    onPressed: () {},
                  )
                ],
              ),
             
              
 Row(
                children:  <Widget>[

                  Container(
                      padding: const EdgeInsets.all(8.0),
                      decoration: BoxDecoration(
                        border: Border(
                          top: BorderSide(width: 16.0, color: Colors.lightBlue.shade50),
                          bottom: BorderSide(width: 16.0, color: Colors.lightBlue.shade900),
                        ),
                      ),
                      child:  OutlinedButton(
                        child:  const Text("normal"),
                        onPressed: () {
                          print("点击了按钮");
                        },
                      ),
                    )
                ],
              ), Row(
                children:  <Widget>[

                  Container(
                      padding: const EdgeInsets.all(8.0),
                      decoration: BoxDecoration(
                        border: Border(
                          top: BorderSide(width: 16.0, color: Colors.lightBlue.shade50),
                          bottom: BorderSide(width: 16.0, color: Colors.lightBlue.shade900),
                        ),
                      ),
                      child:  OutlinedButton(
                        child:  const Text("normal"),
                        onPressed: () {
                          print("点击了按钮");
                        },
                      ),
                    )
                ],
              ),
Row(
                children: [
                  Container(
                    margin: const EdgeInsets.only(
                        right: 20,
                        left: 20,
                        top: 14),
                    alignment: Alignment.center,
                    color: Colors.blue,
                    child: SizedBox(
                      width: 200,//double.infinity
                      height: 50,
                      child: ElevatedButton(
                        style: ButtonStyle(
                          elevation: MaterialStateProperty.all(0),
                          backgroundColor: MaterialStateProperty.all(Color(0xffFCB605)),
                          shape: MaterialStateProperty.all(RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(35))),
                        ),
                        onPressed: (){},
                        child: const Text(
                          '登录',
                          style: TextStyle(color: Colors.red, fontSize: 15),
                        ),
                      ),

                    ),
                  )
                ],
              ),

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

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

相关文章

基于萤火虫算法优化的lssvm回归预测-附代码

基于萤火虫算法优化的lssvm回归预测 - 附代码 文章目录基于萤火虫算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于萤火虫算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xf…

通信原理 | CRC循环冗余校验码

CRC循环冗余码 CRC校验的手算演示异或运算和多项式步骤一、展开多项式得到CRC除数步骤二、原数据串末端加0(多项式最高是几次就加几个0)步骤三、从左往右,按位异或(所得结果如果不够长,前面的0别忘了添加)CRC(Cyclic Redundancy Check )循环冗余校验码 CRC校验的手算演…

MQ高级(二)死信交换机

一、初识死信交换机&#xff08;P159&#xff09; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; &#xff08;1&#xff09;消费者使用basic.reject或 basic.nack声明消费失败&#xff0c;并且消息的requeue…

使用opencv截取旋转框目标

使用opencv截取旋转框目标1、第一种方法2、第二种方法3、两种方法的简单对比4、opencv 最小面积矩形返回角度的理解4.1、version4.2之前4.1、version4.2之后本文列举了两种方法&#xff0c;使用的数据如图,用的是改版rolabelimg标注的标注文件有四个点的坐标&#xff1a; 1、…

mybatis详述

文章目录一、引言1.1 什么是框架?1.2 什么是ORM框架?1.3使用JDBC完成ORM操作的缺点?二、MyBatis框架2.1概念2.2 MyBatis开发步骤2.3 如何编写mybatis映射文件&#xff08;规范&#xff09;三、mybatis-config.xml 配置补充四、mybatis接口与映射文件指令间 传递参数4.1 传递…

安卓APP源码和设计报告——北京旅游系统

目 录 一、概述11 1.1 课题描述11 1.2 需求分析22 1.3 开发环境33 二、系统分析与概要设计55 2.1 系统功能分析55 2.2 系统模块结构图66 2.3 数据库表的设计66 三、北京旅游系统的登录功能模块的详细设计88 3.1 登录模块的功能描述88 3.2 登录模块的界面布局的设计9…

185: vue+openlayers 引用hover插件,展示各种鼠标cursor样式

第185个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中使用hover效果,这里是引用了一个hover插件。鼠标对应到相应的feature中时候,获取其类型,并且设定不同的鼠标样式。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果Ope…

一篇知晓-内存竟被”无意“破坏,真相究竟如何?

内存是C/C程序员的好帮手&#xff0c;我们通常说C/C程序性能更高其原因之一就在于可以自己来管理内存&#xff0c;然而计算机科学中没有任何一项技术可以包治百病&#xff0c;内存问题也给C/C程序员带来无尽的烦恼。 野指针、数组越界、错误的内存分配或者释放、多线程读写导致…

kotlin之hello world

如果你想一个人写全栈的话&#xff0c;Kotlin Multiplatform &#xff08;以下简称MPP&#xff09;是目前这个星球上最好的选择&#xff0c;没有之一。 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff0c;被称之为 Android 世界的Swift&#xff0c;由 JetBrain…

CTFSHOW web入门 java反序列化篇(更新中)

在做这部分题前&#xff0c;推荐大家先去学习下java反序列化&#xff0c;尤其是CC链 可以看下两个系列视频&#xff0c;收获颇多 https://space.bilibili.com/2142877265/channel/collectiondetail?sid29805&ctype0 https://www.bilibili.com/video/BV16h411z7o9/?spm_i…

手写Spring2(实现 Bean 的定义、注册、获取)

文章目录前言本章目标一、实现1、项目结构2、BeanFactory-bean工厂3、BeanDefinition -bean定义4、单例注册接口定义和实现-SingletonBeanRegistry 、DefaultSingletonBeanRegistry5、AbstractBeanFactory-抽象bean工厂类(定义模板方法)6、AbstractAutowireCapableBeanFactory-…

python配置环境问题记录------2022/12/07

python配置问题记录1、版本匹配的问题2、指令安装相关依赖包3、pycharm指定解释器4、运行网络模块5、总结1、版本匹配的问题 到官网下载合适的版本&#xff08;注意位数&#xff0c;我这里选的是64位&#xff09;&#xff0c;pycharm选的是21年版本的&#xff0c;太新的话会有…

【C++】异常exception

目录 一.C语言错误处理方式 1.assert(断言) 2.返回/设置错误码 二.C异常的概念与使用 1.异常的概念 2.异常的使用 三.自定义异常体系MyException 四.异常的重新抛出 五.异常安全问题 六.异常规范 七.异常的优缺点对比 一.C语言错误处理方式 一个C语言程序, 在运行期…

回归分析与相关分析的区别和联系

在本节中&#xff0c;我们将首先讨论相关性分析&#xff0c;它用于量化两个连续变量之间的关联&#xff08;例如&#xff0c;独立变量与因变量之间或两个独立变量之间&#xff09;。 最近我们被客户要求撰写关于回归分析与相关分析的研究报告&#xff0c;包括一些图形和统计输…

软件测试经验与教训

下面精选出10条&#xff0c;和大家分享。 01 测试人员是项目的前灯 一个项目就像是一次陆上旅行。有些项目很简单、很平常&#xff0c;就像是大白天开车去商店买东西。但是大多数值得开发的项目更像是夜间在山里开越野卡车&#xff0c;这些项目需要前灯&#xff0c;而测试员要照…

直播带货行业如何入局?先了解一下直播商城源码吧

直播行业的爆火已经持续了多个年头&#xff0c;直到今天&#xff0c;在人们的生活中依然有着举足轻重的地位&#xff0c;它通过多元化的方案为许多行业带来了新的思路&#xff0c;特别是与传统商业所结合的“直播电商”、“直播商城”的卖货新形式&#xff0c;让多方因此而受益…

数理化解题研究杂志社数理化解题研究编辑部2022年第30期目录

教学改革探索 信息技术下中职数学“翻转课堂”教学创新策略研究 李宇仙; 2-4《数理化解题研究》投稿&#xff1a;cn7kantougao163.com 基于高中数学核心素养的错题讲评课之探索与实践 施浩妹; 17-20 高中数学“问题导学”模式的实践研究 吴金桥; 21-23 立于神而…

【测试沉思录】21. 如何用 JMeter 编写性能测试脚本?

作者&#xff1a;宋赟 编辑&#xff1a;毕小烦 Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例…

【强化学习论文合集】十.2018智能体和多智能体系统国际联合会议论文(AAMAS2018)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

十四、SpringBoot-自动装配原理

十四、SpringBoot-自动装配原理 SpringBoot与Spring比较起来&#xff0c;优化的点主要有&#xff1a; 自动配置&#xff1a;是一个运行时&#xff08;应用程序启动时&#xff09;的过程&#xff0c;考虑了众多因素&#xff0c;才决定Spring配置应该用哪个&#xff0c;不该用哪…