Flutter 如何立即(通过键盘)切换焦点组?
当从一个焦点组遍历到下一个焦点组(键盘上有tab键)时,我希望焦点移动到下一个组的第一个字段,但它似乎什么都不聚焦,然后另一个tab键移动到该组中Flutter 如何立即(通过键盘)切换焦点组?,flutter,web,desktop,Flutter,Web,Desktop,当从一个焦点组遍历到下一个焦点组(键盘上有tab键)时,我希望焦点移动到下一个组的第一个字段,但它似乎什么都不聚焦,然后另一个tab键移动到该组中 class MyHomePage扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回脚手架( 正文:中( 孩子:大小盒子( 宽度:double.infinity, 孩子:排( mainAxisAlignment:mainAxisAlignment.space, 儿童:[ 对于(变量i=0;i
class MyHomePage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
孩子:大小盒子(
宽度:double.infinity,
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
对于(变量i=0;i<2;i++)
聚焦动作检测器(
onFocusChange:(聚焦){
如果(!聚焦){
打印(“已离开焦点组”);
}
},
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
对于(变量i=0;i<3;i++)
大小盒子(
宽度:150,
子项:TextField(),
),
],
),
),
],
),
),
),
);
}
}
我希望在第一组的最后一个字段之后,按下Tab
键会立即将焦点移动到下一个焦点组的第一个项目
我尝试过各种形式的
FocusNode
,FocusScope
,FocusScope.of(context)。\uuuuuuuuuuu
,但我发现《颤振》中的焦点管理有点混乱。前言:我不是焦点
方面的专家,我自己也觉得很复杂
但我相信,以下内容适用于您所追求的内容,从一列遍历到下一列,而不关注“不可见”的项目。至少在移动设备上。网络平台。。。这是一场完全不同的球赛(我怀疑它是否同样有效)
我去掉了FocusableActionDetector
(它本身充当FocusNode
),并将每一列包装在FocusTraversalGroup
中。我相信,如果可能的话,颤振会尝试从一个TraversalGroup转到另一个TraversalGroup
FocusScope
包装遍历组可防止后退按钮和任何其他可单击项获得焦点(一旦FocusScope
获得焦点)
我已经复制到下面的相关部分
└─Child 2: FocusScopeNode#c83f0(_ModalScopeState<dynamic> Focus Scope [IN FOCUS PATH])
│ context: FocusScope
│ IN FOCUS PATH
│ focusedChildren: FocusScopeNode#7d536([IN FOCUS PATH])
│
├─Child 1: FocusScopeNode#7d536([IN FOCUS PATH])
│ │ context: FocusScope
│ │ IN FOCUS PATH
│ │ focusedChildren: FocusNode#1b886([PRIMARY FOCUS]),
│ │ FocusNode#72c3b, FocusNode#34b25, FocusNode#3b410,
│ │ FocusNode#02fac, FocusNode#61cd5
│ │
│ ├─Child 1: FocusNode#1d51e(FocusTraversalGroup)
│ │ │ context: Focus
│ │ │ NOT FOCUSABLE
│ │ │
│ │ ├─Child 1: FocusNode#3b410
│ │ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#70699]
│ │ │
│ │ ├─Child 2: FocusNode#34b25
│ │ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#7c822]
│ │ │
│ │ └─Child 3: FocusNode#72c3b
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#f00bc]
│ │
│ └─Child 2: FocusNode#bdb17(FocusTraversalGroup [IN FOCUS PATH])
│ │ context: Focus
│ │ NOT FOCUSABLE
│ │ IN FOCUS PATH
│ │
│ ├─Child 1: FocusNode#1b886([PRIMARY FOCUS])
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#c5a56]
│ │ PRIMARY FOCUS
│ │
│ ├─Child 2: FocusNode#61cd5
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#a4dd8]
│ │
│ └─Child 3: FocusNode#02fac
│ context: EditableText-[LabeledGlobalKey<EditableTextState>#fe12d]
│
├─Child 2: FocusNode#4886e
│ context: Focus
│
└─Child 3: FocusNode#9241b
context: Focus
└─子2:FocusScopeNode#c83f0(_ModalScopeState焦点范围[焦点路径中])
│ 背景:聚焦镜
│ 对焦路径
│ focusedChildren:FocusScopeNode#7d536([焦点路径])
│
├─子1:FocusScopeNode#7d536([焦点路径])
│ │ 背景:聚焦镜
│ │ 对焦路径
│ │ 焦点儿童:焦点节点#1b886([主要焦点]),
│ │ FocusNode#72c3b、FocusNode#34b25、FocusNode#3b410、,
│ │ 聚焦节点#02fac,聚焦节点#61cd5
│ │
│ ├─子1:FocusNode#1d51e(FocusTraversalGroup)
│ │ │ 背景:焦点
│ │ │ 不聚焦
│ │ │
│ │ ├─子1:FocusNode#3b410
│ │ │ 上下文:EditableText-[LabeledGlobalKey#70699]
│ │ │
│ │ ├─子2:FocusNode#34b25
│ │ │ 上下文:EditableText-[LabeledGlobalKey#7c822]
│ │ │
│ │ └─子3:FocusNode#72c3b
│ │ 上下文:EditableText-[LabeledGlobalKey#f00bc]
│ │
│ └─子2:FocusNode#bdb17(FocusTraversalGroup[焦点路径中])
│ │ 背景:焦点
│ │ 不聚焦
│ │ 对焦路径
│ │
│ ├─子1:FocusNode#1b886([主焦点])
│ │ 上下文:EditableText-[LabeledGlobalKey#c5a56]
│ │ 主要焦点
│ │
│ ├─子2:FocusNode#61cd5
│ │ 上下文:EditableText-[LabeledGlobalKey#a4dd8]
│ │
│ └─子3:FocusNode#02fac
│ 上下文:EditableText-[LabeledGlobalKey#fe12d]
│
├─子2:FocusNode#4886e
│ 背景:焦点
│
└─子3:FocusNode#9241b
背景:焦点
完美答案,关于使用debugDumpFocusTree
的不错奖励FocusTraversalGroup
主要是我需要的,您帮助我更好地理解了它的工作原理。除此之外,对于我的用例,我需要在聚焦时设置TextField
的选择,因此我使用skipTraversal:true
将TextField包装成focuschange
,并在onFocusChange
中设置控制器选择。谢谢你的回答,非常感谢!
return Scaffold(
appBar: AppBar(
title: Text('Focus Tab Page'),
actions: [
IconButton(icon: Icon(Icons.info_outline), onPressed: debugDumpFocusTree)
],
),
└─Child 2: FocusScopeNode#c83f0(_ModalScopeState<dynamic> Focus Scope [IN FOCUS PATH])
│ context: FocusScope
│ IN FOCUS PATH
│ focusedChildren: FocusScopeNode#7d536([IN FOCUS PATH])
│
├─Child 1: FocusScopeNode#7d536([IN FOCUS PATH])
│ │ context: FocusScope
│ │ IN FOCUS PATH
│ │ focusedChildren: FocusNode#1b886([PRIMARY FOCUS]),
│ │ FocusNode#72c3b, FocusNode#34b25, FocusNode#3b410,
│ │ FocusNode#02fac, FocusNode#61cd5
│ │
│ ├─Child 1: FocusNode#1d51e(FocusTraversalGroup)
│ │ │ context: Focus
│ │ │ NOT FOCUSABLE
│ │ │
│ │ ├─Child 1: FocusNode#3b410
│ │ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#70699]
│ │ │
│ │ ├─Child 2: FocusNode#34b25
│ │ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#7c822]
│ │ │
│ │ └─Child 3: FocusNode#72c3b
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#f00bc]
│ │
│ └─Child 2: FocusNode#bdb17(FocusTraversalGroup [IN FOCUS PATH])
│ │ context: Focus
│ │ NOT FOCUSABLE
│ │ IN FOCUS PATH
│ │
│ ├─Child 1: FocusNode#1b886([PRIMARY FOCUS])
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#c5a56]
│ │ PRIMARY FOCUS
│ │
│ ├─Child 2: FocusNode#61cd5
│ │ context: EditableText-[LabeledGlobalKey<EditableTextState>#a4dd8]
│ │
│ └─Child 3: FocusNode#02fac
│ context: EditableText-[LabeledGlobalKey<EditableTextState>#fe12d]
│
├─Child 2: FocusNode#4886e
│ context: Focus
│
└─Child 3: FocusNode#9241b
context: Focus