Flutter - 主动检查是否按下了特殊键(如 ctrl)

问题描述 投票:0回答:2

问题:如何主动检查是否按下了某个(装饰)键,如CTRLSHIFT,如:

if (SomeKeyboardRelatedService.isControlPressed()) {...}

背景

我想检查当用户单击鼠标时是否按下了某个(装饰)键。我们无法做到 active。 相反,我们使用

RawKeyboardListener
并记住
isControlPressed
onKey
事件中。这样,稍后在
GestureDetector.onTap
我们可以检查
isControlPressed
是否是
true
。问题是:

  1. 我们自己维护按键状态似乎没有任何道理,因为它违反了单一真实来源原则并且可能导致不一致。
  2. 如果用户在按住特殊键的同时离开应用程序,它实际上会导致不一致。

我们看了相关的文档,用了几个关键词搜索,都没有结果。

flutter dart keystroke ctrl
2个回答
10
投票

RawKeyboard 可能是您正在寻找的。例子:

RawKeyboard.instance.keysPressed.contains(LogicalKeyboardKey.controlLeft)

请注意,在检查控制键等时,您需要检查所有可能的键变体

final shiftKeys = [LogicalKeyboardKey.shiftLeft, LogicalKeyboardKey.shiftRight];
final isShiftPressed = RawKeyboard.instance.keysPressed
    .where((it) => shiftKeys.contains(it))
    .isNotEmpty;

3
投票

我用这个方法来检测是否按下了 ctrl + v 或 cmd + v,从剪贴板中获取图像

1

// declare focusNode first
final _fokusTitle = FocusNode();

...

2

Padding(
            padding: const EdgeInsets.all(60),
            // listen key press widget
            child: RawKeyboardListener(
              // add focus node here
              focusNode: _fokusTitle,
              child: Text("halo apa kabar , saya disini"),
              onKey: (x) async {
                // detect if ctrl + v or cmd + v is pressed
                if (x.isControlPressed && x.character == "v" || x.isMetaPressed && x.character == "v") {
                  // you need add some package "pasteboard" , 
                  // if you wan to get image from clipboard, or just replace with some handle
                  final imageBytes = await Pasteboard.image;
                  print(imageBytes?.length);
                }
              },
            ),
          )

...

3

Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  // keyboard listener will catch some key pressed here , if you focused cursor here
                                  child: TextFormField(
                                    focusNode: _fokusTitle,
                                    controller: _controllerTitle,
                                    maxLength: 50,
                                    maxLines: 1,
                                    decoration: InputDecoration(hintText: "mulai ketik sesuatu", labelText: "judul"),
                                  ),
                                ),
© www.soinside.com 2019 - 2024. All rights reserved.