想象一下以下情况:
应用程序有一个TextFormField
,用户可以在其中输入一个大字符串。
用户输入时,表单字段将自动向右滚动。到目前为止一切顺利。
TextFormField
还有一个FocusNode
,当用户完成版本时,onFieldSubmitted()
将被取消,因此,调用onFieldSubmitted: (_) => FocusScope.of(context).requestFocus(_someOtherNode);
并请求将新焦点转移到其他领域,像:
TextFormField
value
滚动回到其开始位置,而不是将光标留在结尾处,对吗?事实证明,实际上可以通过更改其TextEditingController
的{{1}} _firsFieldController.value = TextEditingValue(
text: _firstFieldController.text,
selection: TextSelection.collapsed(offset: 0),
composing: TextRange.collapsed(0)));
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));