Flutter:当通过后退按钮关闭键盘时,不关注文本字段(多行)

ste*_*Kim 11 flutter

我有以下几点TextFormField

TextFormField(
  focusNode: inputFocusNode, 
  keyboardType: TextInputType.multiline,
  maxLines: null,
  minLines: 3,
)
Run Code Online (Sandbox Code Playgroud)

当文本字段处于焦点时,键盘出现。当按下手机后退按钮时,键盘会消失,但文本字段上的光标仍然存在。

我知道你可以FocusScope.of(context).unfocus()用来移除光标或取消焦点。然而,似乎没有一种直接的方法来检测键盘关闭而不获得包裹

我该如何解决这个问题?

DIV*_*AHU 8

用这个小部件包裹您的整个应用程序。

Listener(
 onPointerDown: (_) {
   FocusScopeNode currentFocus = FocusScope.of(context);
   if (!currentFocus.hasPrimaryFocus &&
   currentFocus.focusedChild != null) {
   currentFocus.focusedChild.unfocus();
  }
 },
 child: //MyApp()
)
Run Code Online (Sandbox Code Playgroud)

每当用户点击其他任何地方时,它也会删除焦点和光标。


小智 7

作为一个选项,您可以监听窗口指标的变化。

  1. WidgetsBindingObserver向 State 类添加接口
  2. 覆盖didChangeMetrics方法
  3. 添加/删除监听器initStatedispose方法

查看完整代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(home: Scaffold(body: Home())));
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> with WidgetsBindingObserver {
  final FocusNode inputFocusNode = FocusNode();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: TextFormField(
        focusNode: inputFocusNode,
        keyboardType: TextInputType.multiline,
        maxLines: null,
        minLines: 3,
      ),
    );
  }

  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
    final value = WidgetsBinding.instance.window.viewInsets.bottom;
    if (value == 0) {
      inputFocusNode.unfocus();
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    inputFocusNode.dispose();
    super.dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我将其发布为答案,因为由于我的回购协议,我仍然无法发表评论。对我来说,@user10539074 的解决方案不起作用,因为它不让文本字段仅获得焦点(键盘在尝试打开时立即关闭)。所以我添加了这条额外的线,它对我有用。

if (MediaQuery.of(context).viewInsets.bottom != 0)
{
     if (value == 0) {
          inputFocusNode.unfocus();
        }
}
Run Code Online (Sandbox Code Playgroud)

此检查的基本作用是仅在键盘已打开时才运行该代码。