Flutter 按钮组件 TextButton 详解

目录

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.mzph.cn/diannao/73130.shtml

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

相关文章

std::ranges::views::split, lazy_split, std::ranges::split_view, lazy_split_view

std::ranges::views::split, std::ranges::split_view C20 中引入的用于分割范围&#xff08;range&#xff09;的组件&#xff0c;允许将输入范围按特定分隔符或条件分割成多个子范围。以下是详细说明和示例&#xff1a; 基本概念 1. 功能 分割范围&#xff1a;将输入范围&…

c++ constraints与concepts使用笔记

c constraints与concepts使用笔记 1. 模板参数缺乏约束的问题2. Concepts 基本概念3. Concept 的定义与使用4. requires 表达式详解5. requires 从句 vs requires 表达式完整示例&#xff1a;约束矩阵运算 1. 模板参数缺乏约束的问题 问题分析&#xff1a; 传统模板参数没有语…

Qt | 屏幕截图实现

01 全局截屏控件 1. 鼠标右键弹出菜单。 2. 支持全局截屏。 3. 支持局部截屏。 4. 支持截图区域拖动。 5. 支持图片另存为。 演示 点击按钮即可截图 源码: 通过网盘分享的文件:screenwidget屏幕截图 链接: https://pan.baidu.com/s/1PZfQlUXNIoZKEfEtLNV2jQ?pwd=5jsg 提…

2.angular指令

初级使用可以查看视频 参考手册 注意 像ng-class,ng-value,ng-href等这些&#xff0c;很多都可以直接用class“{{}}” 原生写&#xff0c;为啥还出这些指令&#xff0c;是因为原生的比如刚一进页面就先出现表达式了&#xff0c;浏览器走到这里的时候才去解析&#xff0c;给用户…

CTFshow 【WEB入门】信息搜集 【VIP限免】 web1-web17

CTFshow 【 WEB入门】、【VIP限免】 web1 ----源码泄露 首先第一步&#xff0c;看源代码 web2----前台JS绕过 简单点击查看不了源代码&#xff0c;可以强制查看 比如 Ctrl Shift ICtrl U或者在url前加一个view-source: view-source:http://79999ca1-7403-46da-b25b-7ba9…

java 手搓一个http工具类请求传body

import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets;public class HttpUtil {/*** JSON请求发起*/public static String httpJsonRequest(String requestUrl, String requestJson) {String responseJson &…

Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端

来吧&#xff0c;会用就行具体理论不讨论 1、首先pom.xml引入webflux依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 别问为什么因为是响应式....…

写了一个二叉树构造函数和画图函数,方便debug

代码 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

【Pandas】pandas Series asof

Pandas2.2 Series Time Series-related 方法描述Series.asfreq(freq[, method, how, …])用于将时间序列数据转换为指定的频率Series.asof(where[, subset])用于返回时间序列中指定索引位置的最近一个非缺失值 pandas.Series.asof pandas.Series.asof 方法用于返回时间序列…

沉浸式CSS学习路径

好的!我将以魔法学院成长故事为框架,为您设计一套沉浸式CSS学习路径。以下是叙事化学习提纲: 第一卷:像素学徒的觉醒 章节1:被封印的魔法书 发现HTML的"素颜"本质,通过<!DOCTYPE html>解除网页封印用style标签打开CSS魔法书,学会给文字穿上color斗篷和…

使用netlify部署github的vue/react项目或本地的dist,国内也可以正常访问

提供简洁的部署流程和丰富功能&#xff0c;如自定义域名、自动构建和服务器端功能。通过连接到 Git 仓库实现持续部署&#xff0c;每次推送代码都会自动构建和发布&#xff0c;支持无服务器函数&#xff0c;允许在前端项目中实现后端逻辑&#xff0c;提供直观的用户界面来管理和…

复现 MoGe

要复现 MoGe&#xff0c;以下给出一般性的复现训练过程步骤示例&#xff09;的训练过程&#xff0c;你可以参考以下步骤&#xff1a; 环境准备 安装必要的深度学习框架&#xff0c;如 TensorFlow 或 PyTorch&#xff0c;以及相关的库&#xff0c;例如用于数据处理的 NumPy、Pan…

Redis-缓存穿透击穿雪崩

1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中&#xff0c;先查缓存&#xff0c;缓存没有数据&#xff0c;就会请求到数据库上&#xff0c;导致数据库压力剧增。 解决方法&#xff1a; 给不存在的key加上空值&#xff0c;防止每次都会请求到数据库。布隆过滤器…

如何在自己的网站接入API接口获取数据?分步指南与实战示例

将第三方API接入自己的网站是获取实时数据、扩展功能的重要手段&#xff08;如展示商品、同步订单、用户登录等&#xff09;。以下是完整的接入流程与关键实践&#xff0c;以微店API为例&#xff0c;适用于多数开放平台。 一、准备工作&#xff1a;注册与权限申请 注册开发者…

刷leetcode hot100--动态规划3.12

第一题乘积max子数组[1h] emmmm感觉看不懂题解 线性dp【计划学一下acwing&#xff0c;挨个做一下】 线性动态规划 相似题解析 最长上升子序列 最大上升子序列和 最大连续子段和 乘积最大子数组_哔哩哔哩_bilibili 比较奇怪的就是有正负数和0&#xff0c;如何处理&#xff1f…

Pytortch深度学习网络框架库 torch.no_grad方法 核心原理与使用场景

在PyTorch中&#xff0c;with torch.no_grad() 是一个用于临时禁用自动梯度计算的上下文管理器。它通过关闭计算图的构建和梯度跟踪&#xff0c;优化内存使用和计算效率&#xff0c;尤其适用于不需要反向传播的场景。以下是其核心含义、作用及使用场景的详细说明&#xff1a; 一…

postgresql 数据库使用

目录 索引 查看索引 创建 删除索引 修改数据库时区 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 创建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…

TDengine 数据对接 EXCEL

简介 通过配置使用 ODBC 连接器&#xff0c;Excel 可以快速访问 TDengine 的数据。用户可以将标签数据、原始时序数据或按时间聚合后的时序数据从 TDengine 导入到 Excel&#xff0c;用以制作报表整个过程不需要任何代码编写过程。 前置条件 准备以下环境&#xff1a; TDen…