Flutter 按钮组件 TextButton 详解

news2025/3/13 14:53:45

目录

1. 引言

2. TextButton 的基本用法

3. 主要属性

4. 自定义按钮样式

4.1 修改文本颜色

4.2 添加背景色

4.3 修改按钮形状和边距

4.4 样式定制

5. 高级应用技巧

5.1 图标+文本组合

5.2  主题统一配置

5.3 动态交互

6. 性能优化与注意事项

6.1 点击区域优化

6.2 避免过度重建

6.3 无障碍支持

 6.4 点击无响应

相关推荐


1. 引言

        在 Flutter 中,TextButton 是一种无背景的按钮,适用于次要或轻量级操作。它的外观更加简洁,仅包含文字,适合用作辅助性操作,如“取消”或“了解更多”。相比 ElevatedButtonTextButton 没有阴影和背景色,更加简约。

2. TextButton 的基本用法

    TextButton 需要 onPressed 事件和 child 组件。

TextButton(
  onPressed: () {
    print('TextButton 被点击');
  },
  child: Text('点击我'),
)

    如果 onPressed 设为 null,按钮会变为不可点击状态。

TextButton(
  onPressed: null,
  child: Text('不可点击'),
)

3. 主要属性

属性说明
onPressed按钮点击时的回调函数
onLongPress长按时触发的回调
child按钮的内容,如 TextIcon
style自定义按钮样式

示例:

TextButton(
  onPressed: () {},
  onLongPress: () => print('长按按钮'),
  child: Text('长按试试'),
)

4. 自定义按钮样式

4.1 修改文本颜色

TextButton(
  style: TextButton.styleFrom(
    primary: Colors.blue, // 文字颜色
  ),
  onPressed: () {},
  child: Text('自定义颜色'),
)

4.2 添加背景色

TextButton(
  style: TextButton.styleFrom(
    backgroundColor: Colors.blue,
    primary: Colors.white,
  ),
  onPressed: () {},
  child: Text('带背景色的 TextButton'),
)

4.3 修改按钮形状和边距

TextButton(
  style: TextButton.styleFrom(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(20),
    ),
    padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
  ),
  onPressed: () {},
  child: Text('圆角按钮'),
)

4.4 样式定制

TextButton(
            style: ButtonStyle(
              // 文字颜色(包括禁用状态)
              foregroundColor: WidgetStateProperty.resolveWith<Color>(
                    (Set<WidgetState> states) {
                  if (states.contains(WidgetState.disabled)) return Colors.grey;
                  return Colors.blue;
                },
              ),
              // 背景色
              backgroundColor: WidgetStateProperty.all(Colors.transparent),
              // 水波纹颜色
              overlayColor: WidgetStateProperty.all(Colors.blue.withOpacity(0.1)),
              // 内边距
              padding: WidgetStateProperty.all(EdgeInsets.symmetric(horizontal: 16)),
              // 边框形状
              shape: WidgetStateProperty.all(
                RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(8),
                ),
              ),
            ),
            onPressed: () {},
            child: Text('自定义样式'),
          )

5. 高级应用技巧

5.1 图标+文本组合

          TextButton.icon(
            icon: Icon(Icons.add_box_rounded, size: 20),
            label: Text('添加好友'),
            onPressed: () {},
            style: ButtonStyle(
              padding: WidgetStateProperty.all(
                EdgeInsets.symmetric(vertical: 12, horizontal: 20),
              ),
            ),

5.2  主题统一配置

MaterialApp(
  theme: ThemeData(
    textButtonTheme: TextButtonThemeData(
      style: ButtonStyle(
        foregroundColor: MaterialStateProperty.all(Colors.purple),
        textStyle: MaterialStateProperty.all(
          TextStyle(fontWeight: FontWeight.bold)),
      ),
    ),
  ),
)

5.3 动态交互

// 点击缩放动画
TextButton(
  onPressed: () {},
  child: AnimatedContainer(
    duration: Duration(milliseconds: 200),
    transform: isPressed ? Matrix4.diagonal3Values(0.95, 0.95, 1) : null,
    child: Text('动态按钮'),
  ),
)

6. 性能优化与注意事项

6.1 点击区域优化

        默认最小尺寸为 48x48(Material规范),可通过 minimumSize 调整:

style: ButtonStyle(
      minimumSize: MaterialStateProperty.all(Size(100, 50)
    ),

6.2 避免过度重建

        对静态按钮使用 const 优化:

const TextButton(
  onPressed: _handleClick,
  child: Text('静态按钮'),
)

6.3 无障碍支持

const TextButton(
  onPressed: _handleClick,
  child: Text('静态按钮'),
)

 6.4 点击无响应

  • 检查 onPressed 是否为 null

  • 确认父组件未被 IgnorePointer 或 AbsorbPointer 包裹

  • 检测是否被其他组件覆盖(如透明层)

相关推荐

Flutter 基础组件 Text 详解-CSDN博客文章浏览阅读1.1k次,点赞42次,收藏25次。Text 组件是 Flutter 中最常用的 UI 组件之一,用于显示文本内容。它支持样式自定义、多行显示、溢出控制等功能,适用于各种文本场景。本文将详细介绍 Text 组件的使用方式及其重要参数。 https://shuaici.blog.csdn.net/article/details/146067083Flutter 基础组件 Scaffold 详解-CSDN博客文章浏览阅读494次,点赞21次,收藏23次。Scaffold 主要在 MaterialApp 主题下使用,它是实现Material Design基本视觉布局结构的Widget,它为应用提供了一个可定制的结构,包括 AppBar(应用栏)、Drawer(侧边栏)、FloatingActionButton(浮动按钮)、BottomNavigationBar(底部导航栏) 等。本文将详细解析 Scaffold 的功能和使用方法。 https://shuaici.blog.csdn.net/article/details/146067470

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

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

相关文章

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…

vue 自行封装组件,类似于el-tree组件结构

背景&#xff1a; 接口返回是平面数组&#xff0c;需要经过分类处理&#xff0c;转成多维数组&#xff0c;以满足封装组件的数据结构。 有用到插件lodash。 import { groupBy, flattenDeep } from "lodash"; 效果展示&#xff1a; 处理数据&#xff1a; 对于接口返回…

信奥赛CSP-J复赛集训(模拟算法专题)(10):P2356 弹珠游戏

信奥赛CSP-J复赛集训(模拟算法专题)(10):P2356 弹珠游戏 题目背景 题目描述 MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏——超级弹珠。 游戏的内容是:在一个 n n n \times n nn 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只能攻击你所在的行、…

Windows 图形显示驱动开发-WDDM 3.2- WDDM 功能的内核模式测试

概述 在某些情况下&#xff0c;引入了基于 WDDM 或 MCDM 的新计算设备&#xff0c;并且这些设备的驱动程序不支持 D3D 运行时。 为了帮助验证此类驱动程序&#xff0c;将功能添加到 Dxgkrnl &#xff0c;以便仅使用内核模式 thunk 进行验证;也就是说&#xff0c;无需涉及 D3D …

SpringBoot 入门--工程创建

IDEA创建SpringBoot项目 SpringBoot 3.1.5 需要java17 ① 创建Maven工程 ② 导入spring-boot-stater-web起步依赖 ③ 编写Controller ④ 提供启动类 1.打开IDEA&#xff0c;新建项目 2.点击下一步&#xff0c;并勾选web开发相关依赖 3.勾选完点击Create&#xff0c;然后配置…

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全&#xff0c;使用其特有的所有权机制&#xff0c;而无需传统的垃圾收集器。Rust 不强制执行编程范式&#xff0c;但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…

《基于机器学习的DDoS攻击检测与防御系统设计与实现》开题报告

目录 一、课题的研究目的和意义 1.1课题背景 1.2课题目的 &#xff08;1&#xff09;提高DDoS攻击检测的准确性 &#xff08;2&#xff09;加强DDoS攻击的防御能力 &#xff08;3&#xff09;提升网络安全防护的技术水平 1.3课题意义 &#xff08;1&#xff09;理论意义…

【2025】基于springboot+vue的汽车销售试驾平台(源码、万字文档、图文修改、调试答疑)

基于 Spring Boot Vue 的汽车销售试驾平台通过整合前后端技术&#xff0c;实现了汽车销售和试驾预约的信息化和智能化。系统为管理员和用户提供了丰富的功能&#xff0c;提升了客户体验和销售效率&#xff0c;增强了数据分析能力&#xff0c;为汽车销售行业的发展提供了新的途…

C语言每日一练——day_5

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第五天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用

深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识&#xff0c;都会有新的领悟。大约 2 年前&#xff0c;我曾就这一技术方向撰写过另一篇短文《从类型转换视角&#xff0c;浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…

串口通信函数汇总-ing

谢谢各位佬的阅读&#xff0c;本文是我自己的理解&#xff0c;如果您发现错误&#xff0c;麻烦请您指出&#xff0c;谢谢 首先谈谈我自己对于串口的理解&#xff0c;随便拿一个嵌入式的板子&#xff0c;它上面有两个引脚&#xff0c;一个是rx&#xff0c;一个是tx&#xff0c;r…

JVM垃圾回收面试题及原理

1. 对象什么时候可以被垃圾器回收 如果一个或多个对象没有任何的引用指向它了&#xff0c;那么这个对象现在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;则有可能会被垃圾回收器回收 如果要定位什么是垃圾&#xff0c;有两种方式来确定 引用计数法可达性分析算法 1.1 …

Flutter 小技巧之通过 MediaQuery 优化 App 性能

许久没更新小技巧系列&#xff0c;温故知新&#xff0c;在两年半前的《 MediaQuery 和 build 优化你不知道的秘密》 我们聊过了在 Flutter 内 MediaQuery 对应 rebuild 机制&#xff0c;由于 MediaQuery 在 MaterialApp 内&#xff0c;并且还是一个 InheritedWidget &#xff0…

SpringBoot基础Kafka示例

这里将生产者和消费者放在一个应用中 使用的Boot3.4.3 引入Kafka依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…

Spring 的三种注入方式?

1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入&#xff0c;总结起来&#xff0c;无非三种&#xff1a; 属性注入 set 方法注入 构造方法注入 我们分别来看下。 1.1 属性注入 属性注入是大家最为常见也是使用最多的一种注入方式了&#xff0c;代码如下&#x…

STM32第一天建立工程

新建一个工程 1&#xff1a;新建一个文件&#xff0c;添加文件 a:DOC工程说明 》doc说明文档 b&#xff1a;Libraries固件库 》cmsis内核文件 &#xff08;一般这就是stm32内核文件&#xff09; 》FWLIB外设文件 &#xff08;这种就是stm32外设文件不全&#xff09; 》start…

搭建本地化笔记AI:用Copilot+deepseek+nomic-embed-text构建本地智能知识系统

安装Ollama https://ollama.com/ 下载模型 下载大语言模型 根据自己电脑的配置选择模型的大小 ollama run deepseek-r1:8b 下载向量处理模型 创建向量数据库时需要使用Embedding模型对文本进行向量化处理 ollama pull nomic-embed-text 查看安装的模型 ollama listNAME …

【蓝桥杯单片机】第十一届省赛

一、真题 二、创建工程 1.在C盘以外的盘新建文件夹&#xff0c;并在文件夹里面创建两个文件夹Driver 和Project 2.打开keil软件&#xff0c;在新建工程并选择刚刚建好的project文件夹&#xff0c;以准考证号命名 3.选择对应的芯片型号 4.选择否&#xff0c;即不创建启动文件 …

【存储中间件】Neo4J图数据库超详细教程(一):相关介绍、特点及优势、数据模型、软件安装

文章目录 Neo4J超详细教程一、Neo4J相关介绍1.为什么需要图数据库方案1&#xff1a;Google方案2&#xff1a;Facebook 2.特点和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李…

xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱

XXL-JOB XXL-JOB是一个分布式任务调度平台&#xff08;XXL是作者徐雪里姓名拼音的首字母&#xff09;&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址&#xff1a;https://github.com/xuxueli/xxl-job 源码结构&#xff1a; 系统架构 在xxl-j…