flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单AdaptiveTextSelectionToolba样式UI效果

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果

在开发过程中,需要长按TextField输入框cut、copy设置为中文“复制、粘贴”,我首先查看了TextField中的源码,看到了ToolbarOptions、AdaptiveTextSelectionToolbar,这时候我们可以在剪切、复制、选择全部菜单样式UI效果上显示icon的按钮了。

在这里插入图片描述

一、TextField源码中的代码contextMenuBuilder

我这里在中TextField中的源码,看到了ToolbarOptions、AdaptiveTextSelectionToolbar,可以继承AdaptiveTextSelectionToolbar来实现更改剪切、复制、选择全部菜单样式效果

将自定义的AdaptiveTextSelectionToolbar,设置到contextMenuBuilder即可。

TextField源码一段

  /// {@macro flutter.widgets.EditableText.contextMenuBuilder}////// If not provided, will build a default menu based on the platform.////// See also://////  * [AdaptiveTextSelectionToolbar], which is built by default.final EditableTextContextMenuBuilder? contextMenuBuilder;static Widget _defaultContextMenuBuilder(BuildContext context, EditableTextState editableTextState) {return AdaptiveTextSelectionToolbar.editableText(editableTextState: editableTextState,);}

二、自定义AdaptiveTextSelectionToolbar

继承AdaptiveTextSelectionToolbar实现自定义的toolbar样式CustomTextSelectionToolbar

自定义后需要实现按钮列表

List<Widget> resultChildren = <Widget>[];
for (int i = 0; i < buttonItems!.length; i++) {final ContextMenuButtonItem buttonItem = buttonItems![i];resultChildren.add(SelectionToolBarButton(width: 100,height: 50,icon: (i == 0)?Icon(Icons.cut,color: Colors.white,size: 14,):Icon(Icons.copy,color: Colors.white,size: 16,),title: getButtonLabelString(context, buttonItem),onPressed: buttonItem.onPressed,));
}

自定义按钮SelectionToolBarButton,设置icon+title的按钮样式

class SelectionToolBarButton extends StatelessWidget {const SelectionToolBarButton({super.key,required this.width,required this.height,required this.icon,required this.title,required this.onPressed,});final double width;final double height;final Icon icon;final String title;final VoidCallback onPressed;Widget build(BuildContext context) {return GestureDetector(onTap: () {onPressed();},child: Container(color: Colors.black87,width: width,height: height,alignment: Alignment.center,child: Row(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [icon,SizedBox(width: 5,),Text(title,style: TextStyle(fontSize: 15,color: Colors.white,),),],),),);}
}

CustomTextSelectionToolbar完整代码如下

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';class CustomTextSelectionToolbar extends AdaptiveTextSelectionToolbar {const CustomTextSelectionToolbar({super.key, required super.children, required super.anchors});CustomTextSelectionToolbar.editableText({super.key,required EditableTextState editableTextState,}) : super.editableText(editableTextState: editableTextState);Widget build(BuildContext context) {// If there aren't any buttons to build, build an empty toolbar.if ((children != null && children!.isEmpty) ||(buttonItems != null && buttonItems!.isEmpty)) {return const SizedBox.shrink();}List<Widget> resultChildren = <Widget>[];for (int i = 0; i < buttonItems!.length; i++) {final ContextMenuButtonItem buttonItem = buttonItems![i];resultChildren.add(SelectionToolBarButton(width: 100,height: 50,icon: (i == 0)?Icon(Icons.cut,color: Colors.white,size: 14,):Icon(Icons.copy,color: Colors.white,size: 16,),title: getButtonLabelString(context, buttonItem),onPressed: buttonItem.onPressed,));}switch (Theme.of(context).platform) {case TargetPlatform.iOS:return CupertinoTextSelectionToolbar(anchorAbove: anchors.primaryAnchor,anchorBelow: anchors.secondaryAnchor == null? anchors.primaryAnchor: anchors.secondaryAnchor!,children: resultChildren,);case TargetPlatform.android:return TextSelectionToolbar(anchorAbove: anchors.primaryAnchor,anchorBelow: anchors.secondaryAnchor == null? anchors.primaryAnchor: anchors.secondaryAnchor!,children: resultChildren,);case TargetPlatform.fuchsia:case TargetPlatform.linux:case TargetPlatform.windows:return DesktopTextSelectionToolbar(anchor: anchors.primaryAnchor,children: resultChildren,);case TargetPlatform.macOS:return CupertinoDesktopTextSelectionToolbar(anchor: anchors.primaryAnchor,children: resultChildren,);}}/// Returns the default button label String for the button of the given/// [ContextMenuButtonType] on any platform.static String getButtonLabelString(BuildContext context, ContextMenuButtonItem buttonItem) {if (buttonItem.label != null) {return buttonItem.label!;}switch (Theme.of(context).platform) {case TargetPlatform.iOS:case TargetPlatform.macOS:case TargetPlatform.android:case TargetPlatform.fuchsia:case TargetPlatform.linux:case TargetPlatform.windows:assert(debugCheckHasMaterialLocalizations(context));switch (buttonItem.type) {case ContextMenuButtonType.cut:return "剪切";case ContextMenuButtonType.copy:return "复制";case ContextMenuButtonType.paste:return "粘贴";case ContextMenuButtonType.selectAll:return "选择全部";case ContextMenuButtonType.custom:return '';}}}
}class SelectionToolBarButton extends StatelessWidget {const SelectionToolBarButton({super.key,required this.width,required this.height,required this.icon,required this.title,required this.onPressed,});final double width;final double height;final Icon icon;final String title;final VoidCallback onPressed;Widget build(BuildContext context) {return GestureDetector(onTap: () {onPressed();},child: Container(color: Colors.black87,width: width,height: height,alignment: Alignment.center,child: Row(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [icon,SizedBox(width: 5,),Text(title,style: TextStyle(fontSize: 15,color: Colors.white,),),],),),);}
}

三、TextField中使用CustomTextSelectionToolbar

在TextField输入框中设置contextMenuBuilder

static Widget _textFieldContextMenuBuilder(BuildContext context, EditableTextState editableTextState) {return CustomTextSelectionToolbar.editableText(editableTextState: editableTextState,);}

最后在TextField输入框中设置contextMenuBuilder

TextField(contextMenuBuilder: _textFieldContextMenuBuilder,minLines: 1,maxLines: null,keyboardType: TextInputType.multiline,textAlignVertical: TextAlignVertical.center,autofocus: widget.autofocus,focusNode: editFocusNode,controller: widget.textEditingController,textInputAction: TextInputAction.send,
)

至此可以自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果
在这里插入图片描述
在这里插入图片描述
使用系统全局剪切、复制、选择全部设置为中文,可以查看:https://blog.csdn.net/gloryFlow/article/details/132966717

四、小结

flutter开发实战-自定义长按TextField输入框剪切、复制、选择全部菜单样式UI效果。自定义AdaptiveTextSelectionToolbar,在TextField输入框中设置contextMenuBuilder,实现功能。
内容较多,描述可能不准确,请见谅。

本文地址:https://blog.csdn.net/gloryFlow/article/details/132970840

学习记录,每天不停进步。

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

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

相关文章

AI与医疗保健:革命性技术如何拯救生命

文章目录 引言AI的应用领域1. 影像识别2. 疾病诊断3. 药物研发4. 个性化治疗 AI技术1. 机器学习2. 深度学习3. 自然语言处理4. 基因组学 实际案例1. Google Health的深度学习模型2. IBM Watson for Oncology3. PathAI的病理学分析 道德和隐私考虑结论 &#x1f389;欢迎来到AIG…

实验4 交换机端口隔离(access模式)

交换机端口隔离&#xff08;access模式&#xff09; 实验目的实验拓扑实验步骤&#xff08;1&#xff09;在未划分vlan前&#xff0c;配置pc1、pc2的地址&#xff0c;如图所示&#xff08;2&#xff09;测试两台pc机的连通性&#xff08;3&#xff09;创建vlan&#xff0c;并验…

按键点亮led灯

原理图: K0这个按键按下时&#xff0c;开发板D1这个灯亮&#xff0c;松开&#xff0c;灯灭 代码如下: #include "stm32f4xx.h" void LED_Init(void) {//1.定义一个GPIO外设的结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//RCC_AHB1PeriphClockCmd(RCC_AHB1Pe…

Linux底层基础知识

一.汇编&#xff0c;C语言&#xff0c;C&#xff0c;JAVA之间的关系 汇编&#xff0c;C语言&#xff0c;C可以通过不同的编译器&#xff0c;编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操作系统&#xff0c;Java虚拟机是由汇编&#xff0c;C&#xff0c…

分享一下微信商城如何添加新客有礼活动

一、新客有礼活动的优势 新客有礼活动是一种非常有效的营销策略&#xff0c;通过向新用户提供优惠和礼品&#xff0c;可以吸引更多的用户关注和购买。以下是一些新客有礼活动的优势&#xff1a; 吸引新用户&#xff1a;新客有礼活动可以吸引更多的新用户关注和购买&#xff0c…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目&#xff0c;主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势&#xff1a; 支持多个版本的 Python提供验证码本地识别功能可…

docker四种网络模式

文章目录 一.为什么要了解docker网络二.docker 网络理论三.docker的四类网络模式3.1 bridge模式3.2 host模式3.3 container模式3.4 none模式 四.bridge模式下容器的通信4.1 防火墙开启状态4.2 防火墙关闭状态 一.为什么要了解docker网络 当你开始大规模使用Docker时&#xff0…

Springboot部署服务器项目上线

第一步&#xff0c;项目打包&#xff0c;有两种方式 第一种、直接在项目根目录打开终端&#xff0c;输入以下语句即可。如下图&#xff1a; mvn clean package -DskipTests 第二种、在右侧点击 Maven选项&#xff0c;选择鼠标左键双击package选项即可。如下图&#xff1a; 两…

CocosCreator3.8研究笔记(十七)CocosCreator UI组件(一)

CocosCreator 中&#xff0c;用户界面 User-interface&#xff08;UI&#xff09;组件和2d渲染对象的区别在于2D 渲染对象一般只负责将2D 对象渲染出来&#xff0c;而 UI 则更多的承担着用户交互的能力。 常用的 UI 控件可通过添加节点的方式来创建。 在 层级管理器 中点击左上…

算法宝典1——Java版本(此系列持续更新,这篇文章有20道)(有题目的跳转链接)(此份宝典包含了链表、栈、队列、二叉树的算法题)

注&#xff1a;由于字数的限制&#xff0c;我打算把算法宝典做成一个系列&#xff0c;一篇文章就20题&#xff01;&#xff01;&#xff01; 目录 一、链表的算法题&#xff08;目前10道&#xff09; 1. 移除链表元素&#xff08;力扣&#xff1b;思路&#xff1a;前后指针&…

宋浩概率论笔记(六)样本与统计量

参数估计的入门章节&#xff0c;为后面的参数估计与假设检验铺垫基础&#xff0c;难点在于背诵公式&#xff0c;此外对于统计量的理解一定要清晰——本质是多个随机变量复合而成的函数~

ARM接口编程—Interrupt(exynos 4412平台)

CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务&#xff0c;若需要则给予其服务&#xff0c;若不需要一段时间后再次询问&#xff0c;周而复始中断 CPU执行程序时若硬件需要其服务&#xff0c;对应的硬件给CPU发送中断信号&#xff0c;CPU接收到中断信号…

MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、字符…

在c#中使用CancellationToken取消任务

目录 &#x1f680;介绍&#xff1a; &#x1f424;简单举例 &#x1f680;IsCancellationRequested &#x1f680;ThrowIfCancellationRequested &#x1f424;在控制器中使用 &#x1f680;通过异步方法的参数使用cancellationToken &#x1f680;api结合ThrowIfCancel…

js创建动态key的对象ES6和ES5的方法

前提&#xff1a; 有个场景&#xff0c;循环数组&#xff0c;根据每一项的值&#xff0c;往一个数组中push一个新对象&#xff0c;对象的key不同要从数组中获取 情况解析&#xff1a;push没有什么问题&#xff0c;问题就是创建一个动态key的对象。下面就说一下如何以参数为key…

第二证券股票分析:什么是赛道股和题材股?

赛道股和题材股是两种经常被出资者关注的股票类型。赛道股是指代表着产业趋势和未来增加方向的上市公司股票&#xff0c;例如新能源汽车、5G通信等。题材股则是针对商场上的某些抢手事情或话题而产生的股票炒作。那么赛道股和题材股有哪些不同之处&#xff1f;在进行这类出资时…

Claude 使用指南 | 可与GPT-4媲美的语言模型

本文全程干货&#xff0c;让你轻松使用上claude&#xff0c;这也是目前体验cluade的唯一途径&#xff01;废话不多说&#xff0c;直接上教程&#xff0c;cluade的能力不逊于GPT4&#xff0c;号称是ChatGPT4.0最强竞品。相对Chatgpt来说&#xff0c;Claude不仅是完全免费的&…

贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析免疫球蛋白、前列腺癌数据...

原文链接&#xff1a;http://tecdat.cn/?p22702 贝叶斯回归分位数在最近的文献中受到广泛关注&#xff0c;本文实现了贝叶斯系数估计和回归分位数&#xff08;RQ&#xff09;中的变量选择&#xff0c;带有lasso和自适应lasso惩罚的贝叶斯&#xff08;点击文末“阅读原文”获取…

服务器迁移:无缝过渡指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

笔记01:第一行Python

NameError 名字不含特殊符号&#xff08;只能是英文、数字、下划线、中文等&#xff09;名字区分大小写名字先定义后使用 SyntaxError 不符合Python语法书写规范除了语法成分中的保留拼写错误输出中文符号if、for、def等语句末尾忘记冒号 IdentationError 缩进错误&#x…