Flutter 按下按钮时,如何使文本字段内的图标按钮不聚焦文本字段?
以下是我的脚手架内文本字段的代码:Flutter 按下按钮时,如何使文本字段内的图标按钮不聚焦文本字段?,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,以下是我的脚手架内文本字段的代码: child: TextField( obscureText: _obscureText, controller: myController2, focusNode: myFocusNode2, textInputAction: TextInputAction.done, onSubmitted: (value){ myFocusNode2.unfocus(); _loginMethod(); }, decoratio
child: TextField(
obscureText: _obscureText,
controller: myController2,
focusNode: myFocusNode2,
textInputAction: TextInputAction.done,
onSubmitted: (value){
myFocusNode2.unfocus();
_loginMethod();
},
decoration: InputDecoration(
labelText: "Password",
border: OutlineInputBorder(),
suffixIcon: IconButton(
icon: Icon(_obscureText ? Icons.visibility_off: Icons.visibility),
onPressed: (){
setState(() {
_obscureText = !_obscureText;
});
Timer.run(() => myFocusNode2.unfocus());
},
)
),
),
我现在有的东西有用,但一点也不干净。大多数情况下,文本字段会聚焦一秒钟,然后.unfocus()会在延迟后将其取消聚焦,因此我会在键盘弹出然后再向下时获得这种跳跃效果。只有几次文本字段永远不会聚焦,我不明白为什么
有没有办法确保按下图标按钮时不会聚焦文本字段?我只想到3种解决方案,不是完美的,而是完成任务 1-使用带计时器的focusNode 将foucsNode链接到textfield后,按钮函数可以是这样的
onPressed: () {
Timer.periodic(Duration(microseconds: 1), (_) {
focusNode.unfocus();
});
//Write your code here
},
2-使用堆栈
Stack(
alignment: Alignment.centerRight,
children: <Widget>[
TextField(
decoration: InputDecoration(
labelText: "Password",
border: OutlineInputBorder(),
),
),
IconButton(
icon: Icon(Icons.ac_unit),
onPressed: () {
//do any thing
},
),
],
),
堆栈(
对齐:alignment.centerRight,
儿童:[
文本字段(
装饰:输入装饰(
labelText:“密码”,
边框:OutlineInputBorder(),
),
),
图标按钮(
图标:图标(图标。空调单元),
已按下:(){
//做任何事
},
),
],
),
3-正如Afridi Kayal所说,你可以使用一排
Row(
children: <Widget>[
Expanded(
child: TextField(
focusNode: focusNode,
enabled: enabled,
autofocus: false,
textInputAction: TextInputAction.done,
decoration: InputDecoration(
labelText: "Password",
border: OutlineInputBorder(),
),
),
),
IconButton(
icon: Icon(Icons.visibility),
onPressed: () {
print('object');
},
),
],
),
行(
儿童:[
扩大(
孩子:TextField(
focusNode:focusNode,
启用:启用,
自动对焦:错误,
textInputAction:textInputAction.done,
装饰:输入装饰(
labelText:“密码”,
边框:OutlineInputBorder(),
),
),
),
图标按钮(
图标:图标(图标.可见性),
已按下:(){
打印(“对象”);
},
),
],
),
如果您最终选择2号或3号,并且希望在关注文本字段时更改按钮的颜色,您也可以使用focusNode进行更改。也许
focusNode()
会有所帮助。后缀图标位于文本字段内,因此在命中测试期间,文本字段首先获得焦点。您应该将文本字段和图标按钮包装在一个行小部件中。但是,通过这种方式,图标按钮将位于边界之外。如果您希望它位于边框内,您可以删除文本字段的装饰,或者将整行包装在装饰过的容器中。谢谢!第一个选项对我不起作用,但第二个选项非常有效。为了适应我的用例,我在文本字段上创建了一个用于更改焦点的侦听器,如果文本字段具有焦点,它将把图标的颜色更改为边框颜色。但是,当点击该字段时侦听器不工作,因此我在文本字段中还有一个onTap:(){}函数来更改颜色。