如何防止在按下Flutter中的Submit键时键盘消失?

时间:2019-04-26 08:35:22

标签: dart flutter submit android-softkeyboard

我正在开发一个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,
)

5 个答案:

答案 0 :(得分:1)

SystemChannels.textInput.invokeMethod('TextInput.show');

onSubmit方法

答案 1 :(得分:1)

最干净的方法是将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);
       },
  ),

答案 2 :(得分:1)

// 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()

的位置

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

答案 3 :(得分:0)

这对我有用:-

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

FocusNode是一个寿命很长的组件,因此请使用initState方法对其进行初始化:-

FocusNode inputFieldNode;

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

在处理完表单后,不要忘记用FocusNode方法清理dispose:-

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

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

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

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

答案 4 :(得分:0)

TextField小部件具有仅用于此目的的参数!

当用户按下完成键时,onSubmit回调可用于处理业务逻辑,同时还有一个名为onEditingComplete的属性,专门用于处理与焦点相关的逻辑。因此,您应该同时使用两者,以提高代码的可读性。

根据docs

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

当按下完成操作时,例如“完成”,“执行”,“发送”或 “搜索”,将用户的内容提交给控制器,然后 放弃了焦点。

当按下非完成操作时,例如“下一个”或“上一个”, 用户的内容已提交给控制器,但没有关注 放弃,因为开发人员可能希望立即将重点转移到 onSubmitted中的另一个输入小部件。

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

示例代码:

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

演示:

demo gif

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