【问题标题】:Flutter: TextField difference between onEdittingComplete and onSubmittedFlutter:onEdittingComplete和onSubmitted之间的TextField区别
【发布时间】:2020-12-20 17:23:14
【问题描述】:

我在搞清楚onEdittingCompleteonSubmitted的区别,不知道什么时候应该用后者,因为前者可以用来切换焦点或者提交表单的内容。

我尝试查看文档,但没有太多关于 onSubmitted 属性的说明。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    提交时

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

    onEditingComplete

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

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

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

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

    演示:

    【讨论】:

    • 还有 onFieldSubmitted 属性
    【解决方案2】:

    提交时:

    final ValueChanged<String> onSubmitted
    

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

    onEditingComplete:

    final VoidCallback onEditingComplete
    

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

    【讨论】:

    • 相反,它会更新文本控制器 每次输入或删除字符时控制器不会自动更新吗?
    • 我认为 textController 会这样做,但 onEditingComplete 是某种回调机制,它告诉我们文本编辑已完成,现在我们可以使用该值。
    猜你喜欢
    • 2021-12-04
    • 2021-03-31
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    相关资源
    最近更新 更多