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

相关推荐
是席木木啊12 小时前
告别console.log!Vue3项目日志框架选型指南
前端·vue3·日志框架
凰轮12 小时前
TypeScript 知识点总结
前端·javascript·typescript
英俊潇洒美少年12 小时前
告别大请求卡顿!原生 CompressionStream 实现 axios 请求体自动 Gzip 压缩(前后端全适配)
前端
|晴 天|12 小时前
Element Plus 组件库实战技巧与踩坑记录
前端·javascript·vue.js·typescript
im_AMBER13 小时前
从面试题看JS变量提升
开发语言·前端·javascript·前端框架
Mintopia13 小时前
不用学微服务,也能设计不崩的系统:最小可行思路
前端
llf_cloud13 小时前
Vue2 项目中的全局自动弹窗队列设计
前端·javascript·vue.js
百锦再13 小时前
使用JavaScript获取和解析页面内容的完整指南
开发语言·前端·javascript·python·flask·fastapi
sakana13 小时前
如何写一个自己的skill
前端·人工智能
wsdswzj13 小时前
web前端基础知识
前端