我正在开发一个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,
)
答案 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,
)
演示:
有关onSubmitted
和onEditingComplete
回调之间的完整说明和比较,请查看my other answer here。