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

Piy*_*ush 8 submit android-softkeyboard dart 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,
)
Run Code Online (Sandbox Code Playgroud)

Piy*_*ush 13

这对我有用:-

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

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

FocusNode inputFieldNode;

 @override
  void initState() {
    super.initState();
    inputFieldNode = FocusNode();
  }
Run Code Online (Sandbox Code Playgroud)

处理 Form 后不要忘记清理FocusNodeindispose方法:-

 @override
  void dispose() {
    inputFieldNode.dispose();
    super.dispose();
  }
Run Code Online (Sandbox Code Playgroud)

将 分配FocusNode给文本字段并在中写入以下代码onSubmitted::-

TextField(
            focusNode: inputFieldNode,
            onSubmitted: (String) => FocusScope.of(context).requestFocus(inputFieldNode),
          )
Run Code Online (Sandbox Code Playgroud)

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


use*_*613 7

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

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

根据文档

onEditingComplete 的默认实现根据情况执行 2 种不同的行为:

当一个完成动作被按下时,例如“完成”、“去”、“发送”或“搜索”,用户的内容被提交给控制器,然后焦点被放弃。

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

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

示例代码:

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

演示:

演示 gif

有关回调onSubmittedonEditingComplete回调之间的完整解释和比较,请在此处查看我的其他答案


小智 6

最简洁的方法是将 onEditingComplete() 与 TextEditingController 一起使用,而不是 onSubscribed(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);
       },
  ),
Run Code Online (Sandbox Code Playgroud)