Flutter 收起键盘时取消文本框焦点

1,485 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

前言

Flutter项目中经常会使用到TextField组件,它能够实现文本的输入功能。在实际应用中,当我们使用TextField组件输入文本完成后,点击键盘上的收起按钮收起键盘时(不触发onSubmitted属性的情况),TextField组件的焦点并不会自行取消,如果此时我们跳转其他页面后重新返回当前页面,会出现键盘重新弹出的现象,这会导致用户体验质量变差。我们理想的情况是"收起键盘的同时文本框会自动取消焦点",所以本文探讨的主题就是收起键盘时取消文本框焦点

解决方案

在这里介绍一个与键盘可见性相关的依赖:flutter_keyboard_visibilityflutter_keyboard_visibility依赖提供了一个KeyboardVisibilityController控制器,可以通过对KeyboardVisibilityController监听获取有关键盘可见性的直接信息,我们可以在状态改变时做出相应的操作。

功能实现

pubspec.yaml文件中引用flutter_keyboard_visibility依赖,通过这个依赖对键盘的状态进行订阅监听。当判断键盘收起的时候,可以执行取消输入框焦点的操作。

 dependencies:
   flutter_keyboard_visibility: ^5.3.0
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';

// 可通过“with”关键字直接引入功能
mixin KeyboardFocusStateMixin<T extends StatefulWidget> on State<T> {
  late StreamSubscription<bool> keyboardSubscription;

  @override
  void initState() {
    super.initState();
    var keyboardVisibilityController = KeyboardVisibilityController();
    // 监听判断键盘状态
    keyboardSubscription = keyboardVisibilityController.onChange.listen(
      (bool visible) {
        if (!visible) {
          // 取消焦点
          FocusScope.of(context).unfocus();
        }
      },
    );
  }

  @override
  void dispose() {
    // 关闭监听事件,防止内存泄漏
    keyboardSubscription.cancel();
    super.dispose();
  }
}

注: 通过Mixin类的形式实现收起键盘时取消文本框焦点的功能,其他页面只需要通过with关键字就可以直接引用此功能,不需要其他多余的操作。

总结

flutter_keyboard_visibility依赖提供了对键盘的状态订阅监听的方法,可以通过对键盘状态的监听实现取消文本框焦点的操作。同时依赖也提供了许多其他的操作方法,有兴趣可以点击“ flutter_keyboard_visibility ”深入了解。