【问题标题】:How to handle keyboard shortcuts如何处理键盘快捷键
【发布时间】:2020-05-22 17:04:19
【问题描述】:

我正在编写一个 Flutter 应用程序,并且想在应用程序的 Web 版本中处理键盘快捷键,例如 Ctrl+I。

小免责声明:看起来 Flutter API 中的快捷方式最近发生了变化。我发现的在线文档已经过时了。我正在使用Flutter 1.19.0-0.0.pre • channel dev

我发现Actions API Design 文档感觉就像当前可用的 API。根据文档中的示例,我实现了这个简短的 sn-p:

class MyIntent extends Intent {}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Shortcuts(
        shortcuts: {
          LogicalKeySet(LogicalKeyboardKey.control): MyIntent(),
        },
        child: Actions(
          actions: {
            MyIntent: CallbackAction(onInvoke: (i) {
              print('Hello World!!!');
              return null;
            }),
          },
          child: Center(
            child: Column(
              children: <Widget>[
                Text(
                  'Hello World',
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

但是,它不会对按下控制键做出反应,也不会输出预期的消息。在调试代码时,我注意到处理按键事件的ShortcutManager 实例不包含我指定的按键组合,而是包含其他九个按键组合。

有人知道如何使用ShortcutsActions API 对键盘快捷键做出反应吗?

【问题讨论】:

    标签: flutter dart flutter-shortcuts


    【解决方案1】:

    在您的示例中,您的想法是正确的,但您缺少的是 Focus 小部件。如果小部件没有焦点,那么它的祖先 Shortcuts 小部件将不会接收到按键事件来处理它。

    请参阅此Dartpad example 以了解我的意思。该示例在按下“Alt+N”键时添加了一个新的“作业”。

    您还可以使用FocusableActionDetector,它将ShortcutsActions 和鼠标悬停处理组合到一个小部件中。

    【讨论】:

    • dartpad 示例对我来说效果很好,但是有什么方法可以检测按键何时释放?我无法将RawKeyboardListener 包裹在FocusableActionDetector 周围以获取最新的keyup/down 事件,因为它正在抛出'!ancestors.contains(child)': The supplied child is already an ancestor of this node. Loops are not allowed 错误。使用FocusableActionDetectorShortcuts时如何监听最新的按键事件?
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2012-01-21
    • 2016-06-15
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多