• 作者:老汪软件技巧
  • 发表时间:2024-12-22 04:05
  • 浏览量:

一、问题来源

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

二、解决办法

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

/// 账号焦点
final focusNodeAccount = FocusNode();
/// 密码焦点
final focusNodePwd = FocusNode();

...
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,
    ),
  ),
),

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

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、为什么要执行这行代码?

await Future.delayed(const Duration(milliseconds: 350));

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

github


上一条查看详情 +2025年,前端开发为什么一定要学习Rust?
下一条 查看详情 +没有了