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

Flutter:隐藏虚拟键盘但让TextField接收外接键盘/扫码器输入

解决Flutter隐藏虚拟键盘同时保留外接键盘/条码扫描器输入的问题

问题核心:设置keyboardType: TextInputType.none会彻底关闭文本输入通道,不光虚拟键盘弹不出来,外接键盘和条码扫描器的输入也会被拦截。下面是可行的解决方案:

实现思路

不要通过禁用输入类型来隐藏虚拟键盘,而是在TextField获取焦点时主动强制隐藏虚拟键盘,同时保留TextField的可编辑状态,这样外接键盘/扫描器的模拟输入就能正常被捕获。

修改后的代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class QrCodeScanner extends StatefulWidget {
  const QrCodeScanner({super.key});

  @override
  State<QrCodeScanner> createState() => _QrCodeScannerState();
}

class _QrCodeScannerState extends State<QrCodeScanner> {
  final TextEditingController cBarcode = TextEditingController();
  final FocusNode _focusNode = FocusNode();

  @override
  void initState() {
    super.initState();
    // 监听焦点变化,获取焦点时隐藏虚拟键盘
    _focusNode.addListener(() {
      if (_focusNode.hasFocus) {
        SystemChannels.textInput.invokeMethod('TextInput.hide');
      }
    });
    // 页面加载后自动获取焦点,触发隐藏键盘逻辑
    WidgetsBinding.instance.addPostFrameCallback((_) {
      FocusScope.of(context).requestFocus(_focusNode);
    });
  }

  @override
  void dispose() {
    cBarcode.dispose();
    _focusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(12),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextFormField(
              controller: cBarcode,
              focusNode: _focusNode,
              showCursor: true,
              decoration: const InputDecoration(
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.black),
                ),
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(color: Colors.black),
                ),
              ),
              onFieldSubmitted: (String? value) {
                print('Barcode: $value');
              },
              // 保留正常输入类型,确保外接设备输入能被捕获
              keyboardType: TextInputType.text,
            ),
          ],
        ),
      ),
    );
  }
}

关键说明

  1. 焦点监听与键盘隐藏:通过FocusNode监听TextField的焦点状态,一旦获取焦点就调用系统通道强制隐藏虚拟键盘,既阻止了虚拟键盘弹出,又不影响输入通道的开放。
  2. 放弃TextInputType.none:保留正常的keyboardType,确保外接键盘、条码扫描器的模拟输入能被TextField正常接收。
  3. 自动焦点处理:页面加载完成后自动请求焦点,确保用户无需手动点击就能触发隐藏键盘逻辑,同时保持输入框的可交互状态。

这个方案兼容Android和iOS平台,条码扫描器模拟的键盘输入会被正常捕获,虚拟键盘则始终不会弹出。

内容的提问来源于stack exchange,提问作者Erasmo Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:33:11