theme: cyanosis

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


1. Shortcuts 组件的简单使用

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

快捷键体系中,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 方法包裹在想要响应快捷键的组件上即可,当然你可以直接套上去,或者封装一个组件单独维护快捷键的处理。这属于代码结构的问题,可以自己斟酌。


2. 快捷键与焦点的关联

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

final FocusNode _inputNode = FocusNode();

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

如下所示,提供 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 体系也是一个比较复杂的东西,以后有机会再详细介绍。那本文就到这了,谢谢观看 ~

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

  1. Flutter桌面开发 - windows插件开发

    通过此篇文章,你将了解到: Flutter插件的基本介绍: windows插件开发的真实踩坑经验. ⚠️本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 前言 ...

  2. Flutter桌面开发 — Windows App打包以及使用Inno Setup生成.exe文件安装包

    文章目录 1 打包 Flutter Windows App 1.1 开发环境准备 1.2 支持Windows 1.3 构建Windows App 2 使用Inno Setup生成.exe文件安装包 2 ...

  3. android 地图导航开发思路,基础功能-导航组件-开发指南-Android 导航SDK | 高德地图API...

    预置条件 请在您工程的 AndroidManifest.xml 中配置声明导航组件 Activity: android:name="com.amap.api.navi.AmapRouteAc ...

  4. Flutter+FCM开发推送功能

    我是直接站在巨人的肩上了 参考文档,将fcm集成到flutter项目中. 运行遇到错误:MissingPluginException(No implementation found for metho ...

  5. 取消任务栏快捷键翻转_Windows任务栏最有用的键盘快捷键

    取消任务栏快捷键翻转 There's no faster way to navigate your computer than with keyboard shortcuts, and Windows ...

  6. os 键盘快捷键截图_如何通过键盘快捷键更有效地使用OS X虚拟桌面

    os 键盘快捷键截图 () We like having multiple virtual desktops on OS X, especially when we can supercharge t ...

  7. ubuntu idea桌面快捷方式无法启动_每个 Ubuntu 用户都应该知道的键盘快捷键

    (给Linux爱好者加星标,提升Linux技能) 转自:ITPUB技术小栈 无论使用什么操作系统,键盘快捷键都可以帮助你快速上手,可以在启动应用程序或导航到所需窗口时节省时间和精力. 就像Window ...

  8. Google 要用 Flutter 一统移动、桌面开发江湖?

    "Flutter 的核心是一个独立的可执行二进制文件,所以它不仅能改变移动开发的世界,也能改变桌面开发的世界.你只需编写一次代码,就可以在 Android.iOS.Windows.Mac 和 ...

  9. linux关闭桌面快捷键设置,在XFCE4桌面上自定义键盘快捷键的方法

    本文介绍在Linux XFCE4桌面环境上自定义键盘快捷键的方法. 默认键盘快捷键 XFCE4没有像其他Linux桌面环境那样加载许多键盘快捷键,但它确实有很多,这些快捷方式隐藏在桌面设置的" ...

最新文章

  1. 零基础学Python:函数的参数详解
  2. Element UI的Table用法
  3. oracle表空间不足
  4. python re正则查找_python正则表达式 - re
  5. bat文件打开cmd并且运行cmd命令
  6. SVN安装后bin中没有svn.exe,TortoiseSVN安装后bin目录中没有svn.exe;
  7. PHP在线教育直播平台源码 网课小程序源码 在线学习系统源码(PC+小程序+H5 )
  8. ubuntu安装transmission下载BT
  9. smb协议讲解_SMB/CIFS协议解析(一)
  10. 天敏G10数位板安装完PS无压感,观看此教程
  11. 斗魔之残龙纹 第一章
  12. OpenCV 常见问题解决方案
  13. 【Python3之面向对象的程序设计】
  14. 计算机二级office高级应用知识点,2017年全国计算机二级考试MS Office高级应用知识点:电子邮件...
  15. 黄金价格走势软件下载,国内十大现货黄金正规平台排名(2022最新榜单)
  16. Entering emergency mode. Exit the shell to continue
  17. 学术英语(理工)第二版unit5课文翻译
  18. python判断座位号_利用Python实现图书馆座位抓取(自动预约),python,抢座
  19. 下载安卓手机app内不允许下载的视频
  20. MVC开发模式环境搭建

热门文章

  1. 计算机基础知识统考选择题,[电脑基础知识]计算机应用基础统考选择题.doc
  2. 2021年统考计算机应用基础,2021年电大网考计算机应用基础统考答案-20210511065851.doc-原创力文档...
  3. HTML+CSS+Javascript 模拟验证码输入
  4. 用计算机控制人造卫星属于,2012年7月全国高校计算机联合考试(广西考区)一级笔试试题及答案...
  5. 分享一个高效的桌面办公助手
  6. jdk的安装路径在哪_忘记jdk安装路径怎么办
  7. nodersa pkcs1 php,nodejs版本RSA算法签名和验签(SHA1)
  8. 如何将SSH公钥上载到现有Droplet
  9. 3*N分销模式介绍 3*N的应用场景
  10. Class Diagrams