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 后不要忘记清理FocusNode
indispose
方法:-
@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)
现在即使按下提交按钮,文本字段也不会失去焦点。
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)
演示:
有关回调onSubmitted
和onEditingComplete
回调之间的完整解释和比较,请在此处查看我的其他答案。
小智 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)
归档时间: |
|
查看次数: |
5031 次 |
最近记录: |