如何在屏幕上听键盘颤动?

时间:2017-12-14 23:39:06

标签: flutter

我正在构建移动应用程序,我想在键盘出现在屏幕上时移除小部件,即当输入文本字段处于焦点时。

我尝试使用RawKeyboardListener,但这似乎不起作用,我的代码如下:

     new Container(
         child: new RawKeyboardListener(focusNode: new FocusNode(),
         onKey: (input) => debugPrint("*****KEY PRESSED"),
         child: new TextField(
         controller: new TextEditingController(),
    )));

5 个答案:

答案 0 :(得分:3)

您可以使用以下简单检查:

MediaQuery.of(context).viewInsets.bottom == 0

当键盘返回true时,它将关闭键盘,否则打开。 请注意,不仅要从一个小部件获取整个屏幕的上下文(例如,脚手架)。

这是将检查内容集成到代码中的方式:

Visibility(
  child: Icon(Icons.add),
  visible: MediaQuery.of(context).viewInsets.bottom == 0,
)

答案 1 :(得分:2)

当文本字段聚焦时,键盘将自动出现。因此,您可以向focusnode添加一个列表器来监听焦点更改并隐藏相应的小部件。

示例:

    void _listener(){
        if(_myNode.hasFocus){
          // keyboard appeared 
        }else{
          // keyboard dismissed
        }
    }

    FocusNode _myNode = new FocusNode()..addListener(_listner);

    TextField _myTextField = new TextField(
            focusNode: _mynNode,
            ...
            ...
        );

    new Container(
        child: _myTextField
    );

答案 2 :(得分:0)

每当用户按下或释放键盘上的键时,都会调用回调的小部件。

RawKeyboardListener对于侦听原始键事件和表示为键的硬件按钮很有用。通常用于游戏和其他使用键盘输入文字以外的目的的应用。

对于文本输入,请考虑使用EditableText,该文本与屏幕键盘和输入法编辑器(IME)集成。

 const RawKeyboardListener({
Key key,
@required FocusNode focusNode,
@required ValueChanged<RawKeyEvent> onKey,
@required Widget child
})

创建一个接收原始键盘事件的小部件。

对于文本输入,请考虑使用EditableText,该文本与屏幕键盘和输入法编辑器(IME)集成。

实施

const RawKeyboardListener({
  Key key,
  @required this.focusNode,
  @required this.onKey,
  @required this.child,
}) : assert(focusNode != null),
     assert(child != null),
     super(key: key);

答案 3 :(得分:0)

您可以在以下位置使用此库keyboard_visibility:^ 0.5.6: https://pub.dev/packages/keyboard_visibility

要执行代码,请将其插入initState()

KeyboardVisibilityNotification.addNewListener( onChange: (bool visible) { print(visible); this.setState(() { keyboardIsOpen = visible; }); }, );

无论何时打开或关闭键盘,库都会调用可见性为boolean的onChange方法。

答案 4 :(得分:0)

我使用了keyboard_visibility

然后,我用TextField包裹了KeyboardListener,实现如下:

class KeyboardListener extends StatefulWidget {
  final Widget child;
  final void Function(bool) onChange;
  KeyboardListener({@required this.child, @required this.onChange});
  @override
  _KeyboardListenerState createState() => _KeyboardListenerState();
}

class _KeyboardListenerState extends State<KeyboardListener> {
  int _sId;
  KeyboardVisibilityNotification _kvn;

  @override
  void initState() {
    super.initState();
    _kvn = KeyboardVisibilityNotification();
    _sId = _kvn.addNewListener(
      onChange: widget.onChange,
    );
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  @override
  void dispose() {
    _kvn.removeListener(_sId);
    super.dispose();
  }
}