如何防止键盘在颤动中按下提交键时消失?

How to prevent keyboard from dismissing on pressing submit key in flutter?

我正在制作一个 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,
)
SystemChannels.textInput.invokeMethod('TextInput.show');

关于 onSubmit 方法

这对我有用:-

首先创建一个 FocusNode 并将其分配给您的文本字段,执行以下操作:-

FocusNode 是一个长期存在的组件,因此在 initState 方法中对其进行初始化:-

FocusNode inputFieldNode;

 @override
  void initState() {
    super.initState();
    inputFieldNode = FocusNode();
  }

不要忘记在释放表单后清理 dispose 方法中的 FocusNode:-

 @override
  void dispose() {
    inputFieldNode.dispose();
    super.dispose();
  }

FocusNode赋值给文本域,然后在onSubmitted:中写入以下代码:-

TextField(
            focusNode: inputFieldNode,
            onSubmitted: (String) => FocusScope.of(context).requestFocus(inputFieldNode),
          )

现在,即使按下提交按钮,文本框也不会失去焦点。

最干净的方法是将 onEditingComplete() 与 TextEditingController 一起使用,而不是 onSubmitted(text)。参考下面的例子。

  final _controller = TextEditingController();
  TextField(
       controller: _controller,
       padding: EdgeInsets.all(8),
       textInputAction: TextInputAction.send,
       placeholder: 'Type your message',
       onEditingComplete: (){
           if (_controller.text.isEmpty) return;

           sendMessage(_controller.text);
       },
  ),

TextField 小部件有一个参数就是为了这个目的!

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

根据 docs:

The default implementation of onEditingComplete executes 2 different behaviors based on the situation:

When a completion action is pressed, such as "done", "go", "send", or "search", the user's content is submitted to the controller and then focus is given up.

When a non-completion action is pressed, such as "next" or "previous", the user's content is submitted to the controller, but focus is not given up because developers may want to immediately move focus to another input widget within onSubmitted.

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

示例代码:

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

演示:

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

// Focus node
FocusNode _myTextFieldFocusNode = FocusNode();

Widget build(BuildContext context) {
 return SafeArea(
   body: Focus(
     onFocusChange: (hasFocus) => !hasFocus ? _myTextFieldFocusNode.requestFocus() : null
     Container(
      child: // child goes here
     )
   ),
  );
}

如果用户点击类似的东西可以“关闭键盘”Focus() 小部件 将检测到 更改,这是您可能要放置 _myTextFieldFocusNode.requestFocus()

的地方

键盘将没有机会关闭并重新打开