在Flutter中将焦点滑动到TextField

81

最近几天我一直在学习Flutter,在开发我的应用时遇到了一个问题。 我有一个包含所有基本输入字段的基本表单,当用户单击提交按钮时,应用程序检查文本字段的有效性。 如果存在错误输入,则应用程序将焦点返回到文本字段。

如何将焦点移回到文本字段?

4个回答

163

4
如果你想做相反的事情,即将焦点从TextField中移除,简单的方法是调用:FocusScope.of(context).requestFocus(new FocusNode()); //remove focus - kosiara - Bartosz Kosarzycki
5
现在有一个专门的 unfocus 方法。使用 FocusScope.of(context).unfocus();。参考文档:https://api.flutter.dev/flutter/widgets/FocusNode/unfocus.html - Can Rau
3
请注意,为了防止内存泄漏,您需要在widget的dispose方法中释放focusNode。@override void dispose() { focusNode.dispose(); super.dispose(); } - Saman Sattari
@SamanSattari 我认为一般情况下这并不是必要的。你为什么认为它是必要的呢? - Günter Zöchbauer
1
@GünterZöchbauer 你可以通过以下链接查看更多信息:https://dev59.com/71QJ5IYBdhLWcg3wsIBY - Saman Sattari

56
 TextField(
      autofocus: true,
);

13
这不是解决方案,因为它虽然可以使文本字段自动聚焦,但并不一定满足 OP 的要求。因为他想要重新聚焦另一个文本字段。 - tapizquent

15

使用

FocusScope.of(context).previousFocus();


输入图像描述

Column(
  children: [
    TextField(...), // 1st TextField
    TextField(...), // 2nd TextField
    RaisedButton(
      onPressed: () => FocusScope.of(context).previousFocus(), // This is what you need
      child: Text("Go back"),
    ),
  ],
)

1

FocusNode name_focus = FocusNode();

                     TextField(
                        controller: name_Controller,
                        focusNode: name_focus,
                        decoration: InputDecoration(
                          errorText: name_validate ? 'Enter Name' : null,
                          labelStyle:
                              TextStyle(color: HexColor(HexColor.gray_text)),
                          labelText: "Name",
                          border: OutlineInputBorder(),
                          enabledBorder: OutlineInputBorder(
                              borderSide:
                                  BorderSide(color: HexColor(HexColor.gray))),
                          focusedBorder: OutlineInputBorder(
                              borderSide:
                                  BorderSide(color: HexColor(HexColor.gray))),
                        ),
                      ),

检查验证名称不为空,自动滚动我的页面以显示。

 if(name_Controller.text.isEmpty){
   name_validate=true;
   name_focus.requestFocus();
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接