You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用axis:.vertical创建多行TextField后onSubmit失效,求解决方案

问题解决方案

一、多行TextField实现双击回车触发提交

多行模式下TextField的onSubmit会被回车触发换行而非提交,要实现双击回车提交,可通过监听输入内容变化判断连续两次回车事件:

  1. 定义状态变量记录上一次输入是否为回车:
bool _lastCharWasEnter = false;
final TextEditingController _textController = TextEditingController();
  1. 在TextField中通过onChanged实现逻辑:
TextField(
  controller: _textController,
  maxLines: null,
  axis: Axis.vertical,
  onChanged: (content) {
    if (content.isEmpty) {
      _lastCharWasEnter = false;
      return;
    }
    final lastChar = content[content.length - 1];
    // 判断当前和上一次都是回车,触发提交
    if (lastChar == '\n' && _lastCharWasEnter) {
      // 执行提交逻辑
      _handleSubmit(content.substring(0, content.length - 2));
      // 移除末尾的两个回车,保持输入框内容整洁
      _textController.text = content.substring(0, content.length - 2);
      _textController.selection = TextSelection.fromPosition(
        TextPosition(offset: _textController.text.length)
      );
    }
    _lastCharWasEnter = lastChar == '\n';
  },
)

也可通过RawKeyboardListener监听物理按键事件,适合需要区分软键盘和物理键盘的场景。

二、单行模式下提交不收起键盘

单行TextField默认触发onSubmitted后会自动收起键盘,要保持键盘展开,可通过FocusNode重新请求焦点实现:

  1. 提前创建FocusNode:
final FocusNode _inputFocusNode = FocusNode();
  1. 在TextField中配置:
TextField(
  maxLines: 1,
  focusNode: _inputFocusNode,
  textInputAction: TextInputAction.send, // 自定义键盘提交按钮样式
  onSubmitted: (content) {
    // 执行提交逻辑
    _handleSubmit(content);
    // 重新请求焦点,避免键盘收起
    FocusScope.of(context).requestFocus(_inputFocusNode);
  },
)
  1. 组件销毁时释放FocusNode:
@override
void dispose() {
  _inputFocusNode.dispose();
  super.dispose();
}

内容的提问来源于stack exchange,提问作者user20085023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:01:01