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:(){}函数来更改颜色。