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

相关推荐
linweidong32 分钟前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
leobertlan4 小时前
2025年终总结
前端·后端·程序员
子兮曰4 小时前
OpenClaw架构揭秘:178k stars的个人AI助手如何用Gateway模式统一控制12+通讯频道
前端·javascript·github
百锦再5 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君5 小时前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再5 小时前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI5 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
失忆爆表症7 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录7 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜7 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试