Flutter 空白处关闭键盘输入

Posted Xiao冰同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter 空白处关闭键盘输入相关的知识,希望对你有一定的参考价值。

Flutter 优化之点击空白处关闭键盘

效果预览

iPhone SE 2效果
为了能更好的看到运行效果,本机的预览用的是 iPhone SE 2,因为 ios 设备一般都没有回退键,所以更易于观察效果。

环境

开发环境

Flutter 1.22.6.stable

运行环境

iPhone SE 第二代

解决方案

据笔者所知,能解决这个问题有两种方案第一种是定义 BaseBody组件 ,第二种是使用第三方的插件 flutter_keyboard_visibility

第一种方案

import 'package:flutter/material.dart';

class BaseBody extends StatelessWidget {

  final Widget child;

  const BaseBody({@required this.child, Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      child: child,
      behavior: HitTestBehavior.opaque,
      onTap: () => FocusScope.of(context).requestFocus(FocusNode())
    );
  }
}

其中的关键代码主要是

FocusScope.of(context).requestFocus(FocusNode()

然后在任意页面的外部套用 BaseBody组件就行了


class Deno extends StatefulWidget {
  const Deno({Key key}) : super(key: key);

  @override
  _DenoState createState() => _DenoState();
}

class _DenoState extends State<Deno> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: BaseBody(
        child: TextField(
        ),
      ),
    );
  }
}

但是这样的弊端就是非常的耦合,不利用代码的维护。

第二种方案(推荐)

使用第三方的插件,在 pubspec.yaml中加入以下依赖

flutter_keyboard_visibility: 4.0.6

具体用法可以参考 pub.dev

在 MaterialApp 外部套用 KeyboardDismissOnTap 组件,可以参考以下代码

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown
    ]);
    return ScreenUtilInit(
      designSize: Size(1080.0, 1910.0),
      allowFontScaling: false,
      builder: () => OKToast(
        dismissOtherOnShow: true,
        backgroundColor: Color(0xFF3A3A3A),
        position: ToastPosition.center,
        child: KeyboardDismissOnTap(
          child: MaterialApp(
            debugShowCheckedModeBanner: false,
            color: Colors.black,
            home: LoginView(),
            theme: ThemeData(
              platform: TargetPlatform.iOS
            ),
            // home: ChartsFlutter(),
            onGenerateRoute: ApplicationRouter.router.generator,
            builder: EasyLoading.init(),
            localizationsDelegates: [
              // 本地化代理
              GlobalMaterialLocalizations.delegate,
              GlobalCupertinoLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
            ],
            supportedLocales: [
              const Locale('zh', 'CN'), // 中文简体
              // const Locale('en', 'US'), // 美国英语
            ],
            navigatorKey: navGK,
            // debugShowMaterialGrid: true,
          )
        )
      )
    );
  }

这样的好处就是全局设置,避免了代码耦合,但是弊端是增加了最后打包文件的体积(原生插件对体积的影响比较大)

注意事项

使用 第一种方案的 GestureDetector 组件要注意 手势(点击也是手势的一种)冲突的问题,一般要注意配置合适的 behavior 属性。
因为 flutter_keyboard_visibility 这个插件是 原生插件,所以添加完插件之后请重新编译运行

以上是关于Flutter 空白处关闭键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 空白处关闭键盘输入

在 Flutter 应用程序中的 ListView 滚动上隐藏/关闭键盘

Flutter textField随着键盘弹出升高,点击空白处收回键盘

android怎么点击空白处吧软键盘消失

Flutter - 键盘隐藏时TextFormField变为空白

部分ios手机软键盘关闭,软键盘弹起位置空白占位问题