Flutter:onEdittingComplete 和 onSubmitted 之间的 TextField 差异

Meh*_*bla 6 dart flutter

我想弄清楚onEdittingComplete和之间的区别onSubmitted,我不知道什么时候应该使用后者,因为前者可用于切换焦点或提交表单内容。

我尝试查看文档,但关于该onSubmitted物业的说法不多。

use*_*613 19

提交时

顾名思义,它在用户完成编辑时调用,例如按键盘上的“完成”或“发送”。回调方便地将值传递给您,因此您可以使用它来执行您的业务逻辑。同时,由于 Flutter 假设用户已经“完成”,它会隐藏屏幕键盘。

编辑完成

这更像是一个“仅供参考”,告诉您用户已完成编辑。它之前 被解雇了onSubmitted。它不会将值传递给您(虽然您在技术上可以使用控制器获取值,但这不是这里的意图),因为您仍然可以在onSubmitted. 无论如何,这两个事件都会触发。

背后的真正目的onEditingComplete是,在默认实现中,当键盘动作被认为是“完成动作”时,Flutter 会隐藏屏幕键盘,例如“完成”、“去”、“发送”或“搜索”,但如果操作是“未完成”,例如“下一个”或“上一个”,则不会隐藏键盘。(键盘操作在TextField小部件的textInputAction属性中指定。)

如果你不喜欢这种行为,你可以覆盖它。例如,“发送”在这里被认为是“完成动作”,因此在即时消息(聊天)应用程序中,用户每次发送短消息时,键盘都会折叠,这是不好的。但是如果我们将onEditingComplete回调覆盖为一个空函数,它将停止默认行为并且不会隐藏键盘。例如:

TextField(
  controller: _controller,
  onSubmitted: (text) {
    sendMessage(text);
    _controller.clear();
  },
  onEditingComplete: () {}, // do not hide keyboard
  textInputAction: TextInputAction.send,
)
Run Code Online (Sandbox Code Playgroud)

演示:

演示 gif


jit*_*555 4

提交时:

final ValueChanged<String> onSubmitted
Run Code Online (Sandbox Code Playgroud)

它在回调中返回TextField输入的值onSubmitted,大多数情况下在使用TextInputAction.nextTextInputAction.previous执行时用于键盘的下一个/上一个字段按钮textInputAction

编辑完成时:

final VoidCallback onEditingComplete
Run Code Online (Sandbox Code Playgroud)

它与回调类似onSubmitted,但不会在回调中返回值,而是更新文本,然后我们可以从需要的地方controller获取值。controller