Flutter Button 实例

news2024/11/26 18:24:07

在这里插入图片描述
大家好,我是 17。

在上篇文章 使用 Flutter Button 介绍了如何修改 button 的样式,本文来具体实践一下。

本文列举一些常用的 button 效果,以便在用到的时候方便使用。因为 ElevatedButton 最常用,所以大多以 ElevatedButton 举例。

ElevatedButton 一般是用做主 button 的。之所以叫 ElevatedButton 是因为按下的时候会有 elevation 变大的效果。

去掉水波效果

ElevatedButton(
   child: Text('IAM17'),
   style: ButtonStyle(splashFactory: NoSplash.splashFactory),
   onPressed: () {},
 )

监听状态变化

class _MyWidgetState extends State<MyWidget> {
  late MaterialStatesController controller;
  
  void initState() {
    controller = MaterialStatesController();
    controller.addListener(() {
      print(controller.value);
    });
    super.initState();
  }

  
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return ElevatedButton(
      statesController: controller,
      onPressed: () {},
      child: Text('IAM17'),
    );
  }
}

比如当按住按钮的时候,会输出 {MaterialState.pressed},当松开按钮的时候会输出{}。被禁用的时候输出{MaterialState.disabled}

shape 动画,size 和 文字样式

class _MyWidgetState extends State<MyWidget> {
  var elevation = 10.0;
  OutlinedBorder shape = CircleBorder();
  
  void initState() {
    super.initState();
  }

  
  void dispose() {
    super.dispose();
  }
  
  Widget build(BuildContext context) {
    return ElevatedButton(
      clipBehavior: Clip.hardEdge,
      style: ElevatedButton.styleFrom(
          fixedSize: Size(100, 100),
          textStyle:TextStyle(fontSize: 20),
          shape: shape,
          animationDuration: Duration(milliseconds: 600),
          elevation: elevation),
      onPressed: () {
        setState(() {
          elevation = elevation == 10 ? 20 : 10;
          shape =
              shape is CircleBorder ? RoundedRectangleBorder(borderRadius:BorderRadius.circular(10)) : CircleBorder();
        });
      },
      child: Text('IAM17'),
    );
  }
}

animationDuration 可以为 elevation 和 shape 提供动画支持。本例中,按钮从圆形和矩形之间不断变换,除了 shape 变化,elevation(投影)也会随着变化。

默认情况下 clip.none。如果按钮的文字过长会溢出。设置 clip.hardEdget 防止溢出。

fixedSize 设置按钮的大小,当然了,会受到最大最小值和父级的约束影响。

文字样式写在 style 的 textStyle ,不要去 child 的 Text 那里写。

foregroundColor、backgroundColor 和 overlayColor

ElevatedButton.styleFrom(
    splashFactory: NoSplash.splashFactory,
    foregroundColor: Colors.amber,
    backgroundColor:Colors.green,
   ) 

foregroundColor 是文字的颜色。别去 child 的 Text 设置文字颜色了。

backgroundColor 是背景色。

当按下按钮的时候显示的是 overlayColor,一般是一个半透明的,覆盖在 backgroundColor 上面,child 的下面。styleFrom 是不能设置 overlayColor 的。overlayColor 直接取 foregroundColor 并设置好的透明度,一般情况下我们不需要单独设置。单独设置 overlayColor 可以用 ButtonStyle。

ButtonStyle(
   splashFactory: NoSplash.splashFactory,
   foregroundColor: MaterialStateProperty.all<Color>(Colors.amber),
   backgroundColor: MaterialStateProperty.all<Color>(Colors.green),
   overlayColor: MaterialStateProperty.all<Color>(Colors.pink),
 )

ButtonStyle 设置的 overlayColor 是不会自动加上透明效果,如果要透明,需要自己加透明效果。比如Color.fromRGBO(0, 0, 0, .2)

disabled color

ElevatedButton(
      style:ElevatedButton.styleFrom(
        disabledBackgroundColor: Colors.grey,
        disabledForegroundColor:Colors.black54
      ),
      onPressed: null,
      child: Text('IAM17'),
    )

按钮 disabled 后,按下去不会有反应了。只需要设置好 disabledBackgroundColor 和 disabledForegroundColor 即可,overlayColor 不需要设置了。

给按钮加边框

style:ElevatedButton.styleFrom(
        side: BorderSide()
 ),

圆形

加边框很简单,side 属性就可以办到。和shape 配合可以做出各种形状的 border,比如圆形 border。

style:ElevatedButton.styleFrom(
        shape: CircleBorder(),
        fixedSize: Size(80,80),
        side: BorderSide(color: Colors.red,width: 4,strokeAlign: StrokeAlign.inside)

strokeAlign 参数表示border 是画在shape 的外部,内部还是中间。如果 clipBehavior不为 Clip.none, 那么最好设置为 StrokeAlign.inside

还有几种 shape 也一起介绍下吧。其实这些 shape 先有个印象即可,知道有这些 shape 可以用。

BeveledRectangle

style:ElevatedButton.styleFrom(
        shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(20)),
        fixedSize: Size(120,80),
        side: BorderSide(color: Colors.red,width: 4))

ContinuousRectangle

style:ElevatedButton.styleFrom(
        shape: ContinuousRectangleBorder( borderRadius: BorderRadius.circular(40)),
        fixedSize: Size(120,80),
        side: BorderSide(color: Colors.red,width: 4))

RoundedRectangle

style:ElevatedButton.styleFrom(
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
        fixedSize: Size(80,80),
        side: BorderSide(color: Colors.red,width: 4),

如果把 30 改变为 40 就变成圆形了。

stadium

style:ElevatedButton.styleFrom(
        shape: StadiumBorder(),
        fixedSize: Size(120,80),
        side: BorderSide(color: Colors.red,width: 4),

stadium 的中文含意是 体育场,我们看形状也还真挺像的。

不知道你注意到没有 和 Text 的样式一样,side 也可以写在 各种 border 里面。但我们写的时候,最好都写在外面的 side 参数那里。

OutlineButton

OutlineButton 自带边框,没有背景色,没有 elevation。通常不作为主操作按钮。

带 icon 的 button

ElevatedButton.icon(
        onPressed: () {}, icon: Icon(Icons.account_box), label: Text('IAM17'));

Flutter 这里还是很贴心的,为我们准备了 icon 命名构造函数。 OulineButton,TextButton也都有 icon 的构造函数。其实内部实现就是用了一个 Row。

如果只有一个 icon,那么可以用 IconButton 了。

渐变背景 button

ClipRRect(
            borderRadius: BorderRadius.circular(4),
            child: Stack(
              children: <Widget>[
                Positioned.fill(
                  child: Container(
                    decoration: const BoxDecoration(
                      gradient: LinearGradient(
                        colors: <Color>[
                          Color(0xFF0D47A1),
                          Color(0xFF1976D2),
                          Color(0xFF42A5F5),
                        ],
                      ),
                    ),
                  ),
                ),
                TextButton(
                  style: TextButton.styleFrom(
                    foregroundColor: Colors.white,
                    padding: const EdgeInsets.all(16.0),
                    textStyle: const TextStyle(fontSize: 20),
                  ),
                  onPressed: () {},
                  child: const Text('IAM17'),
                ),
              ],
            ),
          )

由于背景色只能用 Color ,所以要做出一个渐变背景色的 button 还是很麻烦的,需要叠加才行。最后还得用 ClipRRect 剪裁成圆角。

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

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

相关文章

wifi 概率性自动断线(IpReachabilityMonitor)和 案例介绍

IpReachabilityMonitor机制,有时候会遇到用户反馈wifi 会概率性自动断线,最后发现是系统有开启IpReachabilityMonitor 机制,可能是在干扰严重环境下或相对弱信号下让系统误判导致下断线。 这篇博主写的非常好.wifi 概率性自动断线(IpReachabilityMonitor)_lost_provision…

Cesium+Vue3+vite 环境搭建(nvm安装使用),以及简单上手

目录 【nvm的安装和使用】 1、安装nvm 2、配置nvm 3、测试 一、Vite项目 1、创建一个新的Vite项目 解决问题&#xff1a;npm ERR! Unexpected token . 2、安装Cesium插件 3、项目配置 【1】在vite.config.js里进行配置 【2】清空style.css 【3】在App.vue里面进行全…

深度剖析指针(下)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的指针呀&#xff0c;上两篇博客我们基本上已经把知识点过了一遍&#xff0c;这篇博客就让小雅兰来带大家看一些和指针有关的题目吧&#xff0c;现在&#xff0c;就让我们进入指针的世界吧 复习&#xff1a; 数组和…

利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

最近在看数据增强方法时&#xff0c;看到了这个有趣的工具包&#xff0c;研究了下并以yolo数据标注格式为例写了一个示例脚本。 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息&#xff01; import albumentations as A import cv2 import os""&…

【摄像头模块】口罩识别功能调试问题总结

文章目录一. 初始化二.程序烧录三.识别是否佩戴口罩小项目中常用到摄像头模块&#xff0c;文章内容疑问&#xff0c;可以私信交流 一. 初始化 1.初始界面为版本号&#xff0c;以及SD卡识别 如果未出现此界面&#xff0c;则可以按板子上的RST键&#xff0c;或者重新刷固件 …

C++动态规划之最长上升子序列

1 子序列与上升子序列1.1 子序列一个序列A{a1,a2,...an}中任意删除若干项&#xff0c;剩余的序列叫做A的一个子序列。例如序列A{1,3,5,4,2}&#xff0c;删除其中的第3项和第5项&#xff0c;得到序列B{1,3,4}&#xff0c;删除其中的第3项和第4项&#xff0c;得到序列C{1&#xf…

详述java的设计模式(三)

1.装饰者模式 装饰者模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装。 使用场景&#xff1a; 在不影响其他对象的情况下&#xff…

使用Python免费试用最新Openai API

一、背景介绍 3月2日凌晨&#xff0c;OpenAI放出了真正的ChatGPT API&#xff0c;不是背后的GPT-3.5大模型&#xff0c;是ChatGPT的本体模型&#xff01;ChatGPT API价格为1k tokens/$0.002&#xff0c;等于每输出100万个单词&#xff0c;价格才2.7美金&#xff08;约18元人民…

数据可视化展示:打工人常见职业病,颈腰椎病占比最高达66.51%

身体健康才是一切的根本。只有身体健健康康才能更好的去享受世间的美好&#xff0c;无论是谁都应当注重身体健康&#xff0c;而不是无度的挥霍它&#xff01; 良好的身体&#xff0c;释放给工作&#xff0c;健壮的体魄&#xff0c;享受美好生活&#xff0c;良好的心态&#xff…

2023年独立站建站平台有哪些?

在当今互联网时代&#xff0c;网站已经成为了人们展示自我、宣传企业、交流信息的重要平台。如果您想要打造自己的网站&#xff0c;但是没有足够的技术和设计经验&#xff0c;那么独立站建站平台可能是一个不错的选择。下面介绍一些常见的独立站建站平台。 WordPress&#xff…

活动回顾(PPT+视频)|全球人工智能开发者先锋大会 Jina AI 的现场直击!

2 月 25 - 26 日&#xff0c;全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在上海临港中心成功举办&#xff0c;Jina AI 的高级算法工程师参加「 AI 工程化 MLOps 论坛」为大家带来精彩的主题演讲《多模态 AI 应用开发新范式》&#xff0c;开源集市迎来近 500 位小…

Python机器学习实战(一)

文章目录基于逻辑回归实现乳腺癌预测基于k-近邻算法实现鸢尾花分类基于决策树实现葡萄酒分类基于朴素贝叶斯实现垃圾短信分类基于支持向量机实现葡萄酒分类基于高斯混合模型实现鸢尾花分类基于主成分分析实现鸢尾花数据降维基于奇异值分解实现图片压缩基于逻辑回归实现乳腺癌预…

谷歌seo独立站搜索引擎优化指南【2023新版】

作为一个拥有十年操作经验的个人站长&#xff0c;我认为SEO是网站优化的核心&#xff0c;它可以帮助我们的网站在搜索引擎上获得更高的排名和更多的流量。在本篇文章中&#xff0c;我将分享我的谷歌SEO独立站搜索引擎优化指南&#xff0c;希望对您有所帮助。 一、关键词研究 关…

Invalid <url-pattern> [sso.action] in filter mapping

Tomcat 8.5.86版本启动web项目报错Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [sso.action] in filter mapping 查看项目的web.xml文件相关片段 <filter-mapping><filter-name>SSOFilter</filter-name><url-pattern&g…

Linux I2C 驱动实验

目录 一、Linux I2C 驱动简介 1、I2C 总线驱动 2、I2C 设备驱动 1、 i2c_client 结构体 2、 i2c_driver 结构体 二、硬件分析 三、设备树编写 1、pinctrl_i2c1 2、在 i2c1 节点追加 ap3216c 子节点 3、验证 四、 代码编写 1、makefile 2、ap3216c.h 3、ap3216c.c …

开发者进阶必备的9个Tips Tricks!

优秀的开发人员市场前景是十分广阔的&#xff0c;但想找到一份理想的工作&#xff0c;仅有代码知识是不够的。优秀的工程师应该是一个终身学习者、问题的创造性解决者&#xff0c;着迷于整个软件世界。要成为一名优秀的开发者&#xff0c;应该具备哪些品质并做出哪些努力&#…

STP详解

STP STP全称为“生成树协议”&#xff08;Spanning Tree Protocol&#xff09;&#xff0c;是一种网络协议&#xff0c;用于在交换机网络中防止网络回路产生&#xff0c;保证网络的稳定和可靠性。它通过在网络中选择一条主路径&#xff08;树形结构&#xff09;&#xff0c;并…

【vulhub漏洞复现】redis 4-unacc 未授权访问漏洞

一、漏洞详情影响版本 Redis 2.x&#xff0c;3.x&#xff0c;4.x&#xff0c;5.xRedis默认情况下&#xff0c;会绑定在0.0.0.0:6379(在redis3.2之后&#xff0c;redis增加了protected-mode&#xff0c;在这个模式下&#xff0c;非绑定IP或者没有配置密码访问时都会报错)&#x…

Linux:https静态网站搭建案例

目录介绍httpshttps通信过程例介绍https 整个实验是在http实验基础上进行的 因为http协议在传输的时候采用的是明文传输&#xff0c;有安全隐患&#xff0c;所以出现了https&#xff08;安全套接字层超文本传输协议&#xff09; HTTPS并不是一个新协议&#xff0c; 而是HTTP…

【YOLO系列】YOLOv5超详细解读(网络详解)

前言 吼吼&#xff01;终于来到了YOLOv5啦&#xff01; 首先&#xff0c;一个热知识&#xff1a;YOLOv5没有发表正式论文哦~ 为什么呢&#xff1f;可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧&#xff0c;hh 目录 前言 一、YOLOv5的网络结构 二、输入端 &#xff08;1…