Flutter中点击提交按钮时如何禁用键盘自动隐藏?
点击键盘提交按钮后保持键盘不隐藏的实现方案
点击键盘上的提交按钮时,键盘会自动隐藏。如何实现点击提交操作后,键盘仍保持显示状态?(下图为该场景下的默认行为)我尝试使用requestFocus()方法,但似乎无法解决该问题。

原代码
class KeyboardDismissDemo extends Stateful Widget { const KeyboardDismissDemo({super.key}); @override _KeyboardDismissDemo createState() => _KeyboardDismissDemo(); } class _KeyboardDismissDemo extends State<KeyboardDismissDemo> { final TextEditingController _controller = TextEditingController(); final FocusNode _focusNode = FocusNode(); @override void dispose() { _controller.dispose(); _focusNode.dispose(); super.dispose(); } @override Widget build(BuildContext context) { TextEditingController _controller = TextEditingController(); final FocusNode _focusNode = FocusNode(); return Scaffold( appBar: AppBar( title: Text('Keyboard Dismiss Demo'), ), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Spacer(), TextField( controller: _controller, keyboardType: TextInputType.number, decoration: InputDecoration( labelText: 'Input box for keyboard test', ), autofocus: true, onSubmitted: (value) { // Handle the submit action without hiding the keyboard print('Submitted: $value'); // Refocus the text field to keep the keyboard open _focusNode.requestFocus(); }, ), Spacer(), ], ), ), ), ); } }
问题分析
你的代码存在两个核心问题,导致requestFocus()无法生效:
- 在
build方法内重复声明了_controller和_focusNode,覆盖了类级别的变量,使得onSubmitted中调用的_focusNode并非绑定到TextField的实例。 - TextField未配置
focusNode属性,焦点请求无法关联到目标输入框。
修正后的代码
class KeyboardDismissDemo extends StatefulWidget { const KeyboardDismissDemo({super.key}); @override _KeyboardDismissDemo createState() => _KeyboardDismissDemo(); } class _KeyboardDismissDemo extends State<KeyboardDismissDemo> { final TextEditingController _controller = TextEditingController(); final FocusNode _focusNode = FocusNode(); @override void dispose() { _controller.dispose(); _focusNode.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Keyboard Dismiss Demo'), ), body: SafeArea( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ const Spacer(), TextField( controller: _controller, focusNode: _focusNode, // 绑定焦点节点到输入框 keyboardType: TextInputType.number, decoration: const InputDecoration( labelText: 'Input box for keyboard test', ), autofocus: true, onSubmitted: (value) { print('Submitted: $value'); // 重新请求焦点以保持键盘显示 _focusNode.requestFocus(); }, ), const Spacer(), ], ), ), ), ); } }
额外说明
如果需要更彻底地拦截默认的键盘收起行为,也可以使用FocusScope.of(context).requestFocus(_focusNode)替代直接调用_focusNode.requestFocus(),效果一致。
内容的提问来源于stack exchange,提问作者rozerro
相关产品推荐
相关产品推荐

