Flutter 桌面开发 | 键盘快捷键功能 - Shortcuts 组件

news2024/10/1 5:27:24

theme: cyanosis

在桌面端的开发中,键盘快捷键是非常常见而必要的,比如 Ctrl + F 搜索, Ctrl + C 复制等。Flutter 既然可以开发桌面端应用,那必然要提供自定义快捷键,触发事件的功能支持。这就是本节要介绍的 Shortcuts 组件体系,相关代码后续会放入 FlutterUnit 中,敬请关注 ~


1. Shortcuts 组件的简单使用

首先,来个简单的功能体验一下。还是那初始的计数器项目来开刀,之前是点击按钮数字增加,现在试一下通过快捷键触发更新的逻辑:

image.png

快捷键体系中,Shortcuts 组件维护快捷键(ShortcutActivator)和意图(Intent) 数据的映射,也就是说一个 Shortcuts 组件内部可以定义若干个快捷键。比如下面定义 Ctrl + Q 的快捷键,其对应的意图是 IncrementIntent

dart Widget buildShortcuts({required Widget child}) { return Shortcuts( shortcuts: <ShortcutActivator, Intent>{ LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyQ): const IncrementIntent(), }, child: Actions( actions: <Type, Action<Intent>>{ IncrementIntent: CallbackAction<IncrementIntent>(onInvoke: _incrementCounter), }, child: Focus( autofocus: true, child: child, ), ), ); }

我们需要派生 Intent 来自定义需要的意图,作为事件响应的标识。通过 Actions 组件根据意图来响应快捷键,其中通过 actions 参数维护类型和 Action 回调事件,触发状态类中 _incrementCounter 方法即可。

另外,快捷键体系需要焦点的支持,所以需要 Focus 组件,只有焦点在激活状态,快捷键才可以响应,通过焦点可以控制快捷键是否响应。想要默认情况下响应,可以将 autofocus 置为 true 。

``` ---->[状态类中]---- void _incrementCounter(IncrementIntent intent) { setState(() { _counter++; }); }

class IncrementIntent extends Intent { const IncrementIntent(); } ```

在事件响应时,可以获取意图对象。所以可以在意图派生类中提供成员数据,以便在事件响应时进行访问。比如这里 IncrementIntent 可以有一个增加值的成员,这样在 _incrementCounter 可以获取到意图对象,处理每次自增多少的逻辑。


最后,使用 buildShortcuts 方法包裹在想要响应快捷键的组件上即可,当然你可以直接套上去,或者封装一个组件单独维护快捷键的处理。这属于代码结构的问题,可以自己斟酌。

image.png


2. 快捷键与焦点的关联

下面实现一些输入框通过 Ctrl + Enter 快捷键发送的功能,介绍一下快捷键和焦点的关联。现在的目的是只有当输入框获取焦点之后,才可以响应快捷键。对于输入框来说,它内部有 Focus 组件,并且可以提供 FocusNode 焦点对象来控制焦点:对于输入框来说,焦点激活就是可输入状态:

final FocusNode _inputNode = FocusNode();

image.png

TextField 组件可以设置 focusNode 参数设置焦点对象,

image.png

如下所示,提供 buildShortcutsSend 方法,使用 Ctrl + enter 触发 SendMessageIntent 意图。快捷键触发时,回调 _sendMessage 方法,其中取消焦点,清空文字。焦点取消之后,就无法响应快捷键了,当点击输入框时,焦点会再次激活,可以响应快捷键。

``` Widget buildShortcutsSend({required Widget child}) { return Shortcuts( shortcuts: { LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.enter): const SendMessageIntent(), }, child: Actions( actions: >{ SendMessageIntent: CallbackAction (onInvoke: _sendMessage), }, child: child, ), ); }

void sendMessage(SendMessageIntent intent) { print("====sendMessage:${ctrl.text}==================="); _inputNode.unfocus(); ctrl.clear(); }

class SendMessageIntent extends Intent { const SendMessageIntent(); } ```

到这里,键盘快捷键的使用就介绍得差不多了,希望可以对你在桌面端的开发有所帮助。关于 Focus 体系也是一个比较复杂的东西,以后有机会再详细介绍。那本文就到这了,谢谢观看 ~

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

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

相关文章

【5.19】三、白盒测试方法—程序插桩法

目录 3.2 程序插桩法 3.2.1 目标代码插桩 3.2.2 源代码插桩 小提示&#xff1a;HeisenBugs 黑盒测试和白盒测试的异同 3.2 程序插桩法 程序插桩法是一种被广泛使用的软件测试技术&#xff0c;由J.C.Huang教授提出。简单来说&#xff0c;程序插桩就是往被测试程序中插入测…

合肥工业大学计算机组成原理课设-系统硬件综合设计

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;信息安全本科生课设-系统硬件综合设计报告 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#…

Varnish代理服务器

一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;其采用全新的软件体系机构&#xff0c;和现在的硬件体系紧密配合。与传统的squid相比&#xff0c;Varnish具有高性能、速度快、管理更加方便等优点&#xff0c;目前很多大型…

Python:如何基于滑动窗口进行气候因子间的相关系数分析?(逐像元)

目录 01 常规的相关系数简单说明 02 滑动窗口下的相关系数分析 最近处理一些气候因子的统计分析&#xff0c;遇到一些问题&#xff0c;记录一下。 01 常规的相关系数简单说明 在研究滑动窗口前&#xff0c;我们先来研究一下常规的相关系数分析&#xff0c;为了简化问题&…

《The Element of Style》阅读笔记 —— 章节 I Elementary Rules of Usage

前言&#xff1a;本科期间担任科研助理时&#xff0c;有幸从导师那里借来这本书通读&#xff0c;只记得自己当时在本子上做了一些笔记&#xff0c;但是想不起来具体记了什么&#x1f602;前段时间再次从学院的讲座活动中听闻这本书&#xff0c;决定重温一遍&#xff0c;本篇为此…

实验一 结构化分析与设计——数据流图DFD与模块结构图SC

一、实验目的&#xff1a; 掌握传统结构化分析方法中功能建模的基本思想&#xff0c;即数据流分析技术。数据流图DFD是软件系统的逻辑模型&#xff0c;描绘数据在系统中从输入到输出所经历的变换&#xff08;即加工处理&#xff09;。 同时&#xff0c;了解变换型和事务型数据…

Copernicus DEM 30 metre dataset now freely available01 December 2020

欧空局宣布,除2019年发布的哥白尼DEM 90米分辨率外,30米分辨率数据的访问权限现已延长,数据集对任何注册用户开放和免费。 自2019年以来,哥白尼方案配备了全球一致的高分辨率数字高程模型,供所有用户使用,以处理各种应用。 哥白尼DEM结合了平坦的水体、连贯的河流流、编…

外汇客户收支风险管理系统助力外汇业务便利化

外管局2019年开始发文推行跨境投资便利化政策&#xff0c;2023年商务部等17部门又发文支持贸易外汇收支便利化政策&#xff0c;从一个小范围试点政策&#xff0c;到各部委大力推广支持&#xff0c;银行业内重点推广&#xff0c;这3年间外汇业务便利化经历了什么&#xff1f; …

狂飙,ChatGPT 官方 iOS 版本应用上线

ChatGPT正式发布App&#xff0c;可在苹果应用商店下载&#xff0c;安卓版也不远了 在手机上也能玩ChatGPT了&#xff01;当地时间周四&#xff08;5月18日&#xff09;&#xff0c;人工智能研究公司OpenAI在官网宣布&#xff0c;其在美国推出了聊天机器人ChatGPT的iPhone应用&a…

写公开信可别等被喷,才发现其实可以这样

正文共 1022 字&#xff0c;阅读大约需要 4 分钟 公务员必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成公开信 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Le…

Unity A* Pathfinding Project

先下载免费版 https://arongranberg.com/astar/download# 教程首页 https://arongranberg.com/astar/docs/getstarted.html 创建一个plane 当地面 创建一个gameobject 添加组件 PathFinder 长这样 调整每个格子大小的 创建两个layer 一个是阻挡物的 一个是地面的 这里填入阻…

Helm方式部署 zookeeper+kafka 集群 ——2023.05

文章目录 一、添加helm仓库二、安装部署集群2.1 在线安装zookeeperkafka集群2.2 离线安装zookeeperkafka集群 三、验证kafka与zookeeper是否绑定四、测试集群附&#xff1a;可改善地方卸载应用 一、添加helm仓库 # 添加bitnami和官方helm仓库&#xff1a; helm repo add bitna…

独立版:云贝O2O-V2-2.6.3 优化区域代理登录刷新问题

独立版&#xff1a;v2云贝O2O平台版本、版本更新至2.6.3&#xff0c;微信小程序在线上传、后端可开源&#xff0c;即刻源码持续维护更新中&#xff0c;最新全插件&#xff08;4个&#xff09;包更新&#xff0c;包修复、这个是源码&#xff0c;独立版&#xff1b; 支持一键更新…

C++——模板(初阶) + string

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月19日 内容&#xff1a;C模板 string讲解 目录 前言&#xff1a; 1.模板&#xff1a; 1.函数模板的隐/显示实例化&#xff1a; 2.类模板&#xff1a; 2.STL&#xff1a; 1. 什么是STL&#xff1a; 2.STL六大组件…

【Java入门】Java的语言概述

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Java入门篇系列&#xff0c;该专栏主要讲解&#xff1a;什么是java、java的数据类型与变…

JavaSE入门篇——类和对象(实例理解)

文章目录 一、面向对象简述二、类与对象的基本概念三、类的定义与使用四、this引用五、对象的构造及初始化六、static成员七、 代码块 一、面向对象简述 面向对象是一种现在最为流行的程序设计方法&#xff0c;几乎现在的所有应用都以面向对象为主了&#xff0c;最早的面向对象…

DRMS全国服务中心第一期讲师特训会圆满召开

&#xff0c;时长01:00 近日&#xff0c;【DRMS】数字权益管理系统在美丽的泉城济南展开了为期两天一夜的“【DRMS】全国服务中心首期讲师特训”。此次特训主要针对服务中心的负责人和讲师进行的一场从认知到理念、从规划到执行、从机制到流程的全方位特训。特训中&#xff0c;…

麒麟信安操作系统里安装达梦数据库无法通过./DmServiceDMSERVER启动数据库实例服务的处理

问题现象如下&#xff1a; 但是通过./dmserver pathxxx/dm.ini又能正常启动 查看日志发现有生成日志&#xff1a;/home/dmdba/dmdbms/log/ dm_unknown_yyyymm.log。 日志内容如下&#xff1a; fail to load libpmem.so, libpmem.so: cannot open shared object file: No such …

Nexus私服搭建与使用

文章目录 1 私服简介2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码 3 私服仓库分类4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径 5 私服资源上传与下载步骤1:配置工程上传私服的…

css属性选择器、css3结构选择器、伪元素选择器、仿土豆网隐藏遮罩层案例、伪元素清除浮动

属性选择器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>属性选择器</title><style>…