Flutter 在颤振中将焦点从一个文本字段更改为下一个文本字段

Flutter 在颤振中将焦点从一个文本字段更改为下一个文本字段,flutter,dart,Flutter,Dart,我有两个textFormField小部件。一旦用户完成了第一个文本字段,我想关注下一个textField。有没有办法在颤振中做到这一点?目前,“完成”按钮仅关闭键盘。我猜,focusNode类可能就是这个问题的答案,但不确定它是如何工作的,有没有人有focusNode类的好例子?提前感谢。是的,从a提交的onfield可能是最好的选择 FocusScope.of(context).requestFocus(focusNode) 下面是一个可能有帮助的示例: FocusNode textS

我有两个
textFormField
小部件。一旦用户完成了第一个文本字段,我想关注下一个
textField
。有没有办法在颤振中做到这一点?目前,“完成”按钮仅关闭键盘。我猜,
focusNode
类可能就是这个问题的答案,但不确定它是如何工作的,有没有人有focusNode类的好例子?提前感谢。

是的,从a提交的
onfield
可能是最好的选择

FocusScope.of(context).requestFocus(focusNode)

下面是一个可能有帮助的示例:

    FocusNode textSecondFocusNode = new FocusNode();

    TextFormField textFirst = new TextFormField(
      onFieldSubmitted: (String value) {
        FocusScope.of(context).requestFocus(textSecondFocusNode);
      },
    );

    TextFormField textSecond = new TextFormField(
      focusNode: textSecondFocusNode,
    );

    // render textFirst and textSecond where you want

您可能还希望通过按钮而不是onfildsubmitted触发
FocusScope.of()
,但希望上面的示例为您提供足够的上下文,以便为您的用例构建合适的解决方案。

有一种类似于Android的方法

参数添加到TextFormField小部件,然后将属性添加为

 TextInputAction.next

屏幕截图:


无需使用
FocusNode

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(),
    body: Column(
      children: [
        TextField(
          decoration: InputDecoration(hintText: 'First Name'),
          textInputAction: TextInputAction.next,
          onEditingComplete: () => FocusScope.of(context).nextFocus(),
        ),
        TextField(
          decoration: InputDecoration(hintText: 'Last Name'),
          textInputAction: TextInputAction.done,
          onSubmitted: (_) => FocusScope.of(context).unfocus(),
        ),
      ],
    ),
  );
}
我就是这样做的:

  var _focusNodes = List.generate(6, (index) => FocusNode()));
在TextFormField中:

  TextFormField(
    focusNode: _focusNodes[i],
    maxLines: 1,
    textInputAction: TextInputAction.next,
    onChanged: (text) {
      if (i < _controllers.length) {
        if (text.isEmpty)
          _focusNodes[i - 1].requestFocus();
        else
          _focusNodes[i + 1].requestFocus();
      }
    },
  ),
TextFormField(
聚焦节点:_聚焦节点[i],
maxLines:1,
textInputAction:textInputAction.next,
一旦更改:(文本){
如果(i<\u控制器长度){
if(text.isEmpty)
_focusNodes[i-1].requestFocus();
其他的
_focusNodes[i+1].requestFocus();
}
},
),

欢迎来到StackOverflow。请拿着这本书四处看看,通读一遍,然后阅读,并提供一个答案。如果周围的人能很容易地阅读和理解你的意思,或者问题是什么,他们会更愿意帮助:)在这种情况下,如何更改键盘上的按钮?像其他应用一样,从复选标记到箭头have@busuu据我所知,这不会改变键盘上的按钮。它只会更改键盘上的
enter
键的行为,以便将焦点切换到下一个字段。这是我们目前得到的最好的了。@busuu要将键盘上的“检查”按钮更改为箭头,请在TextFormField上设置以下内容。textInputAction:textInputAction.next如果您需要向键盘添加更多操作,看看这个软件包:对OTP身份验证有用。这不只是改变弹出式键盘吗?这实际上是可行的,但只有当文本字段没有带有onPressed设置的后缀小部件时,它才对我有效。当点击文本输入上的擦除/删除时,有没有办法聚焦上一个screen@A.K.J.94您可以使用更改后的
onChanged
属性并处理其中的逻辑。
  TextFormField(
    focusNode: _focusNodes[i],
    maxLines: 1,
    textInputAction: TextInputAction.next,
    onChanged: (text) {
      if (i < _controllers.length) {
        if (text.isEmpty)
          _focusNodes[i - 1].requestFocus();
        else
          _focusNodes[i + 1].requestFocus();
      }
    },
  ),