我正在制作一个Flutter 应用程序,用户可以在其中键入消息并点击键盘上的发送按钮来发送消息.问题是,当我按下发送按钮时,信息会被发送,但键盘会自动关闭.我怎样才能防止这种情况发生?

TextField(
  autofocus: true,
  keyboardType: TextInputType.multiline,
  maxLines: null,
  decoration: new InputDecoration.collapsed(
    hintText: "Let's talk",
    border: UnderlineInputBorder(
      borderRadius: BorderRadius.circular(1),
    ),
  ),
  textInputAction: TextInputAction.send,
  onSubmitted: null,
)

推荐答案

100 widget has a parameter just for this purpose!

虽然onSubmit回调可用于在用户按下完成时处理业务逻辑,但还有一个名为onEditingComplete的属性,专门用于处理与焦点相关的逻辑.因此,您应该同时使用两者,以获得更好的代码可读性.

根据这docs条:

onEditingComplete的默认实现执行两种不同的

当按下完成操作时,例如"Done"、"Go"、"Send"或 "搜索",用户的内容被提交给控制器,然后 注意力被放弃了.

当按下诸如"下一步"或"上一步"的未完成动作时, 用户的内容将提交给控制器,但焦点不会 放弃,因为开发人员可能希望立即将焦点转移到 onSubmitted中的另一个输入小部件.

因此,如果你不喜欢这种行为,例如,"发送"在这里被认为是"完成操作",因此在即时通讯(聊天)应用程序中,用户每次发送短消息时,键盘都会折叠.但是,如果我们将onEditingComplete回调重写为空函数,它将停止默认行为,并且不会隐藏键盘.

Sample code:

TextField(
  controller: _controller,
  onSubmitted: (value) {
    sendMessage(text);
    _controller.clear();
  },
  onEditingComplete: () {}, // this prevents keyboard from closing
  textInputAction: TextInputAction.send,
)

Demo:

demo gif

有关onSubmittedonEditingComplete回调之间的完整解释和比较,请查看my other answer here.

Dart相关问答推荐

dart - 通过异步等待避免递归 Stackoverflow

Flutter drawArc() 方法绘制完整的圆而不仅仅是圆弧

我可以动态应用 Dart 的字符串插值吗?

运行时出现Flutter错误:Error waiting for a debug connection: Bad state: No element

Flutter - 如何自动启用 AnimatedOpacity?

Flutter 中的嵌套数据和 BLoC

Package:flutter/src/widgets/overlay.dart':Failed assertion: line 133 pos 12: "_overlay != null"

参数类型PointerEvent不能分配给参数类型PointerDownEvent

Flutter ToggleButton 类 - Flutter 1.9.1

未定义命名参数child.在 Center() 构造函数中

Flutter 中 ChangeNotifier 的构建器小部件

如何循环遍历元素列表

为什么 Angular 在组件名称中不需要破折号

polymer SEO 是否友好?

有 Javascript 到 Dart 的转换器吗?

如何在 Dart 中连接两个字符串?

包裹构造函数参数的花括号代表什么?

Dart lambda/shortland 函数混淆

如何在 Dart 中定义接口?

Dart 中的全局变量