颤振:通过后退按钮按下键盘

时间:2020-01-10 04:12:26

标签: flutter

我有以下TextFormField

TextFormField(
  focusNode: inputFocusNode, 
  keyboardType: TextInputType.multiline,
  maxLines: null,
  minLines: 3,
)

当文本字段成为焦点时,出现键盘。当按下电话后退按钮时,键盘消失,但是文本字段上的光标仍然保留。

我知道您可以使用FocusScope.of(context).unfocus()删除光标或使焦点散焦。但是,似乎没有一种直接的方法可以在没有得到package

的情况下检测键盘的松动。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

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

  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();
  }
}

答案 1 :(得分:1)

用这个小部件包裹你的整个应用。

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

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

答案 2 :(得分:0)

您可以检查是否可见键盘,当看不见键盘时,您可以调用unfocus()方法。例如,要跟踪键盘,可以使用此库keyboard_visibility。示例代码:

FocusNode myFocusNode = FocusNode();

KeyboardVisibilityNotification().addNewListener(
    onChange: (bool visible) {
        if (!visible) {
            myFocusNode.unfocus()
        }
    },
);