失去焦点时将光标移到TextFormField的开头

时间:2019-02-15 12:37:49

标签: dart flutter cursor

想象一下以下情况:

  1. 应用程序有一个TextFormField,用户可以在其中输入一个大字符串。

  2. 用户输入时,表单字段将自动向右滚动。到目前为止一切顺利。

  3. TextFormField还有一个FocusNode,当用户完成版本时,onFieldSubmitted()将被取消,因此,调用onFieldSubmitted: (_) => FocusScope.of(context).requestFocus(_someOtherNode); 并请求将新焦点转移到其他领域,像:

TextFormField
  1. 现在,我希望松散的焦点value滚动回到其开始位置,而不是将光标留在结尾处,对吗?事实证明,实际上可以通过更改其TextEditingController的{​​{1}}
_firsFieldController.value = TextEditingValue(
            text: _firstFieldController.text,
            selection: TextSelection.collapsed(offset: 0),
            composing: TextRange.collapsed(0)));
  1. 这一切都是有道理的,而且可行,直到确定为止。这是问题开始的时间。更改TextEditingController的值将为其所有侦听器触发一个ValueNotifier,但是由于这是一个同步过程,因此如果我立即请求将焦点转移到新节点,则游标将不会更新到其开始处,因为实际上,我们需要将重点放在动画上的TextFormField上。

TL; DR

这将不起作用,因为在将光标设置在第一个节点的开始之前将焦点设置到新节点上

onFieldSubmitted: (_) {
     _firstFieldController.value = TextEditingValue(
                                  text: _firstFieldController.text,
                                  selection: TextSelection.collapsed(offset: 0),
                                  composing: TextRange.collapsed(0));
   FocusScope.of(context).requestFocus(_passwordFocusNode);
}

在请求新的焦点以使听众重建之前稍加延迟将使其起作用,但感觉完全不正确

Future.delayed(Duration(milliseconds: 200))
                                  .then((_) => FocusScope.of(context).requestFocus(_newFocusNode));

0 个答案:

没有答案