Flutter疑难杂症:安卓手机键盘焦点丢失问题解决办法

一、问题来源

Flutter开发过程中安卓系统遇到当普通键盘输入用户账号之后,在密码框输入密文时会出现普通键盘先消失,安全键盘再弹出的过程,两种键盘切换的过程会失去焦点,简称键盘失焦。

二、解决办法

就是用 Listener 监听动作,普通键盘和安全键盘切换之后再次请求焦点即可,代码如下:

dart 复制代码
/// 账号焦点
final focusNodeAccount = FocusNode();

/// 密码焦点
final focusNodePwd = FocusNode();
dart 复制代码
...
Listener(
  onPointerDown: (event) async {
    await Future.delayed(const Duration(milliseconds: 350));
    focusNodeAccount.requestFocus();
    SystemChannels.textInput.invokeMethod('TextInput.show');//兼容小米手机

  },
  child: TextField(
    focusNode: focusNodeAccount,
    decoration: InputDecoration(
      border: buildBorder(),
      focusedBorder: buildBorder(),
      hintText: "账号",
      hintStyle: TextStyle(fontSize: 15, color: Color(0xffB3B3B3)),
      fillColor: Colors.white,
      filled: true,
    ),
  ),
),
const SizedBox(height: 8),
Listener(
  onPointerDown: (event) async {
    await Future.delayed(const Duration(milliseconds: 350));
    focusNodePwd.requestFocus();
    SystemChannels.textInput.invokeMethod('TextInput.show');//兼容小米手机
  },
  child: TextField(
    focusNode: focusNodePwd,
    decoration: InputDecoration(
      border: buildBorder(),
      focusedBorder: buildBorder(),
      hintText: "密码",
      hintStyle: TextStyle(fontSize: 15, color: Color(0xffB3B3B3)),
      fillColor: Colors.white,
      filled: true,
    ),
    obscureText: true,
  ),
),

三、总结

1、思路是通过在键盘切换通过 FocusNode 请求再次获取焦点;

2、为什么要执行这行代码?

dart 复制代码
await Future.delayed(const Duration(milliseconds: 350));

是为了等安全键盘完全弹出(动画结束之后)再获取焦点。如果没有此行代码,部分华为机型会先获取到焦点然后二次丢失(测试同学在此阻击过本人,真机直面)。

github

相关推荐
叶玳言14 小时前
【LVGL】从HTML到LVGL:嵌入式UI的设计迁移与落地实践
前端·ui·html·移植
高级测试工程师欧阳14 小时前
HTML 基本结构
前端
Gazer_S14 小时前
【Element Plus 表单组件样式统一 & CSS 文字特效实现指南】
前端·css·vue.js
一只小阿乐14 小时前
Html重绘和重排
前端·html
_Rookie._14 小时前
vue3 使用css变量
前端·javascript·html
杨超越luckly14 小时前
HTML应用指南:利用GET请求获取全国招商银行网点位置信息
前端·arcgis·信息可视化·html·银行网点
蔗理苦14 小时前
2025-09-04 HTML3——区块布局与表单
前端·css·html
GIS之路14 小时前
GDAL 开发起步
前端
被巨款砸中14 小时前
前端视角下的 Web 安全攻防:XSS、CSRF、DDoS 一次看懂
前端·安全·xss
humiaor14 小时前
Flutter之riverpod状态管理详解
flutter·provider·riverpod