Flutter Windows端Shift组合输入大写字符触发KeyRepeatEvent报错求助
问题描述
开发Windows平台Flutter应用时,使用TextField按住左/右Shift键输入大写字符会触发断言错误,使用Caps Lock输入大写则无此问题。报错信息如下:
平台消息回调期间触发了以下断言: 派发了KeyRepeatEvent,但状态显示物理按键并未按下。如果在实际应用中出现此问题,请向Flutter报告bug。如果在单元测试中出现,请确保模拟事件遵循`HardwareKeyboard`文档中说明的Flutter事件模型。触发的事件为:KeyRepeatEvent#d843e(physicalKey: PhysicalKeyboardKey#700e1(usbHidUsage: "0x000700e1", debugName: "左Shift"), logicalKey: LogicalKeyboardKey#00102(keyId: "0x200000102", keyLabel: "左Shift", debugName: "左Shift"), character: null, timeStamp: 124:45:14.849439) 'package:flutter/src/services/hardware_keyboard.dart': 断言失败:第432行第16位:'_pressedKeys.containsKey(event.physicalKey)' 该断言要么表明框架本身存在错误,要么需要在错误信息中提供更多信息以帮助定位并修复根本原因。 无论哪种情况,请向Flutter官方提交bug报告。 抛出异常时的调用栈: #2 HardwareKeyboard._assertEventIsRegular.<anonymous closure> (package:flutter/src/services/hardware_keyboard.dart:432:16) #3 HardwareKeyboard._assertEventIsRegular (package:flutter/src/services/hardware_keyboard.dart:443:6) #4 HardwareKeyboard.handleKeyEvent (package:flutter/src/services/hardware_keyboard.dart:535:5) #5 KeyEventManager.handleRawKeyMessage (package:flutter/src/services/hardware_keyboard.dart:881:37) #6 BasicMessageChannel.setMessageHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:197:49) #7 _DefaultBinaryMessenger.setMessageHandler.<anonymous closure> (package:flutter/src/services/binding.dart:387:35) #8 _invoke2 (dart:ui/hooks.dart:186:13) #9 _ChannelCallbackRecord.invoke (dart:ui/channel_buffers.dart:42:5) #10 _Channel.push (dart:ui/channel_buffers.dart:132:31) #11 ChannelBuffers.push (dart:ui/channel_buffers.dart:329:17) #12 PlatformDispatcher._dispatchPlatformMessage (dart:ui/platform_dispatcher.dart:599:22) #13 _dispatchPlatformMessage (dart:ui/hooks.dart:89:31) (elided 2 frames from class _AssertionError)
Flutter环境配置:
Flutter 3.3.4 • stable通道 • https://github.com/flutter/flutter.git 框架版本 • eb6d86ee27(13天前提交)• 2022-10-04 22:31:45 -0700 引擎版本 • c08d7d5efc 工具版本 • Dart 2.18.2 • DevTools 2.15.0 运行flutter doctor... 检查摘要(查看详情请运行flutter doctor -v): [√] Flutter(stable通道,3.3.4,运行于Microsoft Windows [版本10.0.19044.2130],区域设置de-DE) [√] Android开发工具链(Android SDK版本32.1.0-rc1) [√] Chrome - 支持Web开发 [√] Visual Studio - 支持Windows开发(Visual Studio Community 2022 17.3.6) [√] Android Studio(版本2021.2) [√] VS Code(版本1.71.2) [√] 已连接设备(3台可用) [√] HTTP主机可用性 • 未发现问题!
问题成因
这是Flutter框架在Windows平台上的底层键盘事件处理bug:当按住Shift键输入字符时,系统会持续派发Shift键的重复事件(KeyRepeatEvent),但Flutter内部维护的已按下按键集合_pressedKeys中没有对应的物理键记录,导致断言触发。Caps Lock不会产生按键重复事件,因此不会触发该错误。
解决方法
- 升级Flutter版本:该bug在Flutter 3.7及以后的稳定版中已被修复,执行
flutter upgrade命令升级到最新稳定版即可解决。 - 临时规避方案:若暂时无法升级,可通过全局捕获特定断言错误阻止应用崩溃,在
main函数中添加如下代码:
import 'dart:ui'; void main() { // 忽略键盘事件相关的特定断言错误 PlatformDispatcher.instance.onError = (error, stack) { if (error.toString().contains('_pressedKeys.containsKey(event.physicalKey)')) { return true; } return false; }; runApp(MyApp()); }
- 切换至Beta/Dev通道:如果稳定版暂未推送修复,可切换到Beta或Dev通道获取修复版本:
flutter channel beta flutter upgrade
内容的提问来源于stack exchange,提问作者F.M.
相关产品推荐
相关产品推荐

