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

Flutter 我需要知道用户单击按钮时是否按下了某个键,flutter,dart,flutter-desktop,Flutter,Dart,Flutter Desktop,在Flitter桌面应用程序中,我想知道,当用户用鼠标单击按钮时,他们是否同时按住了一个键(如Shift、Control、Alt等) 如何做到这一点 编辑 我最初的问题不够清楚 我有一个复选框的动态列表,我想使用SHIFT+单击来选择上一个选中的复选框和使用SHIFT down选择的复选框之间的所有内容 我已经看过FocusNode,但它似乎只适用于1个元素。这可以通过一个 您需要一个有状态的小部件,可以在其中使用初始化节点。您需要附加节点并定义在键盘按下时调用的回调。然后,您可以使用reque

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

如何做到这一点

编辑

我最初的问题不够清楚

我有一个复选框的动态列表,我想使用SHIFT+单击来选择上一个选中的复选框和使用SHIFT down选择的复选框之间的所有内容

我已经看过FocusNode,但它似乎只适用于1个元素。

这可以通过一个

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

您还需要调用
\u nodeAttachment.reparent()build
方法中的code>。您还应该在
dispose
中处置节点

下面的示例打印按下按钮时是否按下shift键的true或false。使用
isControlPressed
isAltPressed
属性,可以轻松地将其扩展到其他键,如control和alt


完整示例:

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子项:MyWidget(),
),
),
);
}
}
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
晚期终焦点节点焦点;
晚期终末病灶附着;
bool-isShiftPressed=false;
@凌驾
void initState(){
super.initState();
focus=FocusNode(debugLabel:“按钮”);
_nodeAttachment=focus.attach(上下文,onKey:(节点,事件){
IsShift已按下=事件。IsShift已按下;
});
focus.requestFocus();
}
@凌驾
无效处置(){
focus.dispose();
super.dispose();
}
小部件构建(构建上下文){
_nodeAttachment.reparent();
返回文本按钮(
已按下:(){
打印(已按下);
},
子项:文本('Test'),
);
}
}

对于更具体的问题,您仍然可以使用此解决方案。将上述示例环绕在复选框列表周围。你可以做一些简单的逻辑来获得你想要的行为。如果我这里有不准确的,你应该能够很容易地修改它,以满足你的需要。这证明您可以根据需要使用此方法,即使逻辑中的某些细节不准确:

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子项:MyWidget(),
),
),
);
}
}
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
晚期终焦点节点焦点;
晚期终末病灶附着;
bool-isShiftPressed=false;
列表checkboxStates=List.filled(5,false);
int=1;
@凌驾
void initState(){
super.initState();
focus=FocusNode(debugLabel:“按钮”);
_nodeAttachment=focus.attach(上下文,onKey:(节点,事件){
IsShift已按下=事件。IsShift已按下;
});
focus.requestFocus();
}
@凌驾
无效处置(){
focus.dispose();
super.dispose();
}
小部件构建(构建上下文){
_nodeAttachment.reparent();
返回列(
子项:List.generate(checkboxStates.length,(index)=>复选框(
值:CheckBoxState[索引],
一旦更改:(val){
if(val==null){
返回;
}
设置状态((){
如果(按了移位(&val){
如果(上次单击>=0){
bool loopForward=lastClickedindex;x--){
checkboxStates[x]=true;
}
}
}
}
checkboxStates[index]=val;
});
if(val){
最后单击=索引;
}
否则{
lastClicked=-1;
}
打印('Checkbox$index:$isShiftPressed');
}
)),
);
}
}

非常感谢您的回复。我现在意识到我一定没有把我的问题说清楚。请参阅我原始问题中的编辑。@D.Joe请参阅我的edit@D.Joe你看过我的编辑吗?是的,看过你的编辑,但还没有时间测试。我一实施就通知你。谢谢。终于有时间尝试了,它成功了。谢谢把你的答案标为正确答案。