我需要知道用户单击按钮时是否按下(按下)某个键

2023-12-11

在 Flutter 桌面应用程序中,我想知道当用户用鼠标单击按钮时,他们是否也按住了某个键(如 Shift、Control、Alt 等)。

如何才能做到这一点?

EDIT

我最初的问题不够清楚。

我有一个动态复选框列表,我想使用 SHIFT+单击来选择最后一个选定的复选框和按下 SHIFT 选定的复选框之间的所有内容。

我看过 FocusNode 但这似乎只适用于 1 个元素。


这可以通过FocusNode.

您将需要一个有状态的小部件,您可以在其中使用初始化节点。你需要attach节点并定义按下键盘时调用的回调。然后您可以使用以下命令向节点请求焦点requestFocus以便该节点接收键盘事件。

您还需要致电_nodeAttachment.reparent();在你的build方法。您还应该将该节点放置在dispose.

下面的示例打印 true 或 false 来判断按下按钮时是否按下了 Shift 键。这可以轻松扩展到其他键,例如 control 和 altisControlPressed and isAltPressed特性。


完整示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  late final FocusNode focus;
  late final FocusAttachment _nodeAttachment;
  
  bool isShiftPressed = false;
  
  @override
  void initState() {
    super.initState();
    focus = FocusNode(debugLabel: 'Button');
    _nodeAttachment = focus.attach(context, onKey: (node, event) {
      isShiftPressed = event.isShiftPressed;
    });
    focus.requestFocus();
  }
  
  @override
  void dispose() {
    focus.dispose();
    super.dispose();
  }
  
  Widget build(BuildContext context) {
    _nodeAttachment.reparent();
    return TextButton(
      onPressed: () {
        print(isShiftPressed);
      },
      child: Text('Test'),
    );
  }
}

您仍然可以使用此解决方案来解决更具体的问题。将上面的示例包含在您的复选框列表中。您可以做一些简单的逻辑来获得您想要的行为。如果我这里的内容不准确,您应该能够轻松地根据您的需要进行修改。然而,这证明您可以根据需要使用此方法,即使逻辑中的某些细节不准确:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  late final FocusNode focus;
  late final FocusAttachment _nodeAttachment;
  
  bool isShiftPressed = false;
  
  List<bool> checkboxStates = List.filled(5, false);
  
  int lastClicked = -1;
  
  @override
  void initState() {
    super.initState();
    focus = FocusNode(debugLabel: 'Button');
    _nodeAttachment = focus.attach(context, onKey: (node, event) {
      isShiftPressed = event.isShiftPressed;
    });
    focus.requestFocus();
  }
  
  @override
  void dispose() {
    focus.dispose();
    super.dispose();
  }
  
  Widget build(BuildContext context) {
    _nodeAttachment.reparent();
    return Column(
      children: List.generate(checkboxStates.length, (index) => Checkbox(
        value: checkboxStates[index],
        onChanged: (val) {
          if(val == null) {
            return;
          }
          
          setState(() {            
            if(isShiftPressed && val) {
              if(lastClicked >= 0) {
                bool loopForward = lastClicked < index;
                if(loopForward) {
                  for(int x = lastClicked; x < index; x++) {
                    checkboxStates[x] = true;
                  }
                }
                else {
                  for(int x = lastClicked; x > index; x--) {
                    checkboxStates[x] = true;
                  }
                }
              }
            }
            checkboxStates[index] = val;
          });
          
          if(val) {
            lastClicked = index;
          }
          else {
            lastClicked = -1;
          }
          
          print('Checkbox $index: $isShiftPressed');
        }
      )),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要知道用户单击按钮时是否按下(按下)某个键 的相关文章

随机推荐

  • 在触发器中使用插入和删除的表

    我想编写触发器来处理插入和删除的表 我已经编写了插入触发器 CREATE TRIGGER FILL TABLE ON Person FOR INSERT AS DECLARE ID int SELECT ID p ID FROM Perso
  • 如何计算文档中的行数? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有这样的台词 我想知道我实际上有多少台词 09 16 39 AM all 2 00 0 00 4 00 0 00 0 00 0 00 0 00 0 00 94 00 09 16 4
  • C 中的逻辑运算不符合预期

    有人可以解释一下以下代码的功能吗 include
  • 如何在CSS中绘制循环箭头?

    如何使用 CSS 在中心绘制循环箭头和文本 如下图所示 我尝试过创建曲线箭头 但我不知道如何使其看起来像我想要的那样 arrow width 200px height 200px border 6px solid border radius
  • 通过 setup.exe 创建日志的 msiexec 参数不起作用

    我正在尝试从我的安装中获取使用以下命令的日志setup exe 我可以得到一个日志setup exe V l v c temp installlog txt 但我想通过x参数以及获取 额外的调试信息 当我尝试时setup exe V l v
  • 如何根据 swift 3 中的数组选择复选标记?

    我有一个数组 其中选定的名称将被存储并传递到视图控制器之前 当我需要转到上一个视图控制器时 则需要选择先前选择的复选标记 但在这里它启用了最后一个选定的元素 唯一的问题是如果我选择三个 那么它不是选择三个 它只是检查标记最后一个元素 但我需
  • C# 不通过返回类型推断重载方法

    我正在编写一个 C 程序来抓取目录并提供最后 CSV 行中的日期小于当前日期的文件列表 由于这是一个程序 因此我并没有真正花费太多时间使代码变得非常干净或任何东西 但这只是一个意见问题 我想 奇怪的是下面的一组代码片段 三个静态方法都在同一
  • AngularUI - 兼容的浏览器

    我尝试打开 AngularUI 网站 http angular ui github io 在 IE8 中 UI 在 IE8 中无法正确呈现 在最新版本的 chrome firefox 中工作正常 这促使我搜索 AngularUI 模块的浏览
  • IndexError:列表赋值索引超出范围 - 使用数组的 Python

    我最近开始使用 python 但对于该语言的很多东西我仍然是新手 这段代码应该打印一系列行 例如 47 815 47 54 48 065 57 45 我从几个文本文件 称为 2t1 2t19 3t1 3t19 作为输入以及结束后的文件名 每
  • Cheerio 不会等待正文加载

    我制作了一个非常简单的脚本 它抓取了一个食谱网站以获取标题 准备时间和成分 除了脚本无法抓取数组的每一页之外 一切工作正常 有时我得到 4 个 有时 2 个 有时甚至 0 个 看来脚本不会等待主体完全加载 我完全知道 Cheerio 不理解
  • 带有被安全/ASR 规则阻止的宏的工具 - 如何修复?

    我有一个 Excel 工具 xlsm 文件 我正在向用户传播 他们从我们的网站下载该文件 然后就可以使用它 简而言之 该工具有自己的菜单栏和一堆宏 例如进行计算 从 API 提取数据等 我使用 Unviewable 对用户隐藏代码 我用证书
  • 是否可以以编程方式检测 元素中的插入符位置?

    假设有一个常规的
  • 在python中比较两个字典以获得相似键的最大值

    我有这两个命令 a test1 90 test2 45 test3 67 test4 74 b test1 32 test2 45 test3 82 test4 100 如何提取同一键的最大值以获取新字典 如下所示 c test1 90 t
  • 使用delphi将PNGImage转换为灰度

    你好呀 这是我的代码 procedure TForm4 Button1Click Sender TObject var png TPNGImage data PRGBQarray p tagRGBQuad i o integer begin
  • 在Where 子句或替代选项中使用别名?

    我如何让它工作 它可以在没有Where子句的情况下工作 否则使用Where子句 我会得到明显的错误 但这基本上是需要做的 有人知道如何解决这个问题吗 select ID Name case T N when 1 then City1 whe
  • PUSH 数组 C++?

    如何动态向数组添加值 推送 我可以在 AS3 中执行此操作 但在 C 中找不到它的函数 如果它是静态定义的数组 则不能 如下所示 int array 10 它的大小是固定的 但是 如果您使用诸如std vector你会用 std vecto
  • D3 带边界框的力定向布局

    我是 D3 新手 在设置力导向布局的边界时遇到困难 我已经设法 从示例中 拼凑出我想要的内容 但我需要包含图表 在刻度函数中 变换 翻译将正确显示我的图形 但是当我将 cx 和 cy 与 Math max min 一起使用时 请参阅注释代码
  • 犰狳中的 Rcpp 糖命令

    我正在尝试使用ifelse Rcpp 糖的命令arma vec 代码失败并出现错误 ifelse was not declared in this scope 我找不到解决方案 下面是一个简单的示例代码 导致错误 include
  • 安装 Visual Studio 2015 RTM 后未加载包

    问题 我安装了 Visual Studio 2015 RC 并在其上安装了 Visual Studio 2015 RTM 我在互联网上找不到任何表明您不能这样做的内容 我不知道这是否与问题相关 不幸的是 当我重新启动后第一次启动 Visua
  • 我需要知道用户单击按钮时是否按下(按下)某个键

    在 Flutter 桌面应用程序中 我想知道当用户用鼠标单击按钮时 他们是否也按住了某个键 如 Shift Control Alt 等 如何才能做到这一点 EDIT 我最初的问题不够清楚 我有一个动态复选框列表 我想使用 SHIFT 单击来