flutter - 限制键盘事件,直到子小部件更新
问题描述
在我简单的 Flutter 桌面图像浏览器中,我使用箭头键遍历文件夹中的项目(实际上是 ZIP 存档)。由于加载大图像的速度较慢,如果在图像完全加载之前多次按下箭头键,则会跳过一些图像。我宁愿等待所有图像直到完全加载并将关键事件排队到某个限制(例如最多5个关键事件)。实际的核心片段:
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
body: RawKeyboardListener(
focusNode: focusNode,
autofocus: true,
onKey: handleKey,
child: InteractiveViewer(
child: image,
),
),
);
}
void handleKey(RawKeyEvent keyEvent) async {
if (keyEvent.isKeyPressed(LogicalKeyboardKey.arrowLeft) ||
keyEvent.isKeyPressed(LogicalKeyboardKey.arrowRight) ||
keyEvent.isKeyPressed(LogicalKeyboardKey.home) ||
keyEvent.isKeyPressed(LogicalKeyboardKey.end)) {
int newImageIndex = currentImageIndex;
if (keyEvent.isKeyPressed(LogicalKeyboardKey.arrowLeft)) {
newImageIndex = max(currentImageIndex - 1, 0);
} else if (keyEvent.isKeyPressed(LogicalKeyboardKey.arrowRight)) {
newImageIndex = min(currentImageIndex + 1, widget.fileNameMap.length - 1);
}
if (newImageIndex != currentImageIndex) {
updateImage(newImageIndex);
}
}
void updateImage(int index) {
setState(() {
File file = new File(paths[index]);
image = new Image.file(file);
});
}
解决方案
我发现在图像数据完全加载后更新图像小部件时,可以避免在后续按键时跳过图像,这可以通过ImageProvider以这种方式实现:
void updateImage(int index) {
File file = new File(paths[index]);
var imageData = new FileImage(file);
imageData
.resolve(ImageConfiguration())
.addListener(ImageStreamListener((ImageInfo _, bool __) {
if (mounted) {
setState(() {
image = new Image(image: imageData);
});
}
}));
}`
推荐阅读
- powershell - 使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件
- swift - NSData 中的 Data.map 实现
- python - 如何从 url 获取文件,然后像本地一样读取它?
- github - Github 2FA 不允许我推送到分支
- javascript - 如何将画布视频发送到嵌入的 Discord?
- rust - 如何在 bevy 游戏引擎中为我的 3D 体素游戏绘制多个(10000)立方体?
- c++ - 为什么即使您没有在 c++ 中包含字符串库,字符串有时仍然可以工作?
- postgresql - PostgreSQL 数据库权限混淆
- c++ - 一次打印 5 行
- sql - 我的 mybatis 不适用于 Oracle,但在 SQLDeveloper 中测试过