You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()无法生效:

  1. 在build方法内重复声明了_controller和_focusNode,覆盖了类级别的变量,使得onSubmitted中调用的_focusNode并非绑定到TextField的实例。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:01:16