颤动:检测键盘打开/关闭

时间:2018-02-12 15:51:42

标签: dart flutter

我的应用最上层有一个BottomNavigationBar。我想在app / subtree的任何地方检测键盘打开/关闭,这样只要键盘可见,我就可以显示/隐藏BottomNavigationBar

这是一般性问题,可能与BottomNavigationBar没有直接关系。换句话说,摘自BottomNavigationBar: - )

11 个答案:

答案 0 :(得分:8)

我刚刚创建了一个flutter插件来通知键盘打开/关闭事件。在Android和iOS上均可使用。希望这会有所帮助

https://github.com/adee42/flutter_keyboard_visibility

答案 1 :(得分:8)

KeyboardVisibilityBuilder

如果您不想依赖外部库,则可以使用WidgetsBindingObserver mixin监听键盘显示/隐藏事件。我准备了一个轻量级的KeyboardVisibilityBuilder小部件来为您处理行为。用法与AnimatedBuilder非常相似:

return KeyboardVisibilityBuilder(
  builder: (context, child, isKeyboardVisible) {
    if (isKeyboardVisible) {
      // build layout for visible keyboard
    } else {
      // build layout for invisible keyboard
    }
  },
  child: child, // this widget goes to the builder's child property. Made for better performance.
);

KeyboardVisibilityBuilder实现:

/// Calls `builder` on keyboard close/open.
/// https://stackoverflow.com/a/63241409/1321917
class KeyboardVisibilityBuilder extends StatefulWidget {
  final Widget child;
  final Widget Function(
    BuildContext context,
    Widget child,
    bool isKeyboardVisible,
  ) builder;

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

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

class _KeyboardVisibilityBuilderState extends State<KeyboardVisibilityBuilder>
    with WidgetsBindingObserver {
  var _isKeyboardVisible = false;

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

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeMetrics() {
    final bottomInset = WidgetsBinding.instance.window.viewInsets.bottom;
    final newValue = bottomInset > 0.0;
    if (newValue != _isKeyboardVisible) {
      setState(() {
        _isKeyboardVisible = newValue;
      });
    }
  }

  @override
  Widget build(BuildContext context) => widget.builder(
        context,
        widget.child,
        _isKeyboardVisible,
      );
}

答案 2 :(得分:7)

要检查键盘可见性,只需在窗口小部件树中的任意位置检查viewInsets属性。 <{1}}等于零时隐藏键盘。

您可以使用viewInsets.bottom来检查viewInsets,如:

MediaQuery

希望有所帮助!

答案 3 :(得分:4)

在您的StatefullWidget中创建一个变量

bool _keyboardVisible = false;

然后在build小部件上初始化该变量;

@override
Widget build(BuildContext context) {
    _keyboardVisible = MediaQuery.of(context).viewInsets.bottom != 0;
   return child;
}

答案 4 :(得分:3)

如果WidgetsBinding.instance.window.viewInsets.bottom的值大于0.0,则可以使用键盘。

if(WidgetsBinding.instance.window.viewInsets.bottom > 0.0)
{
   //Keyboard is visible.
}
else
{
   //Keyboard is not visible.
]

答案 5 :(得分:2)

你可以使用 Flutter keyboard visibility plugin

@override
Widget build(BuildContext context) {
  return KeyboardVisibilityBuilder(
    builder: (context, isKeyboardVisible) {
      return Text(
        'The keyboard is: ${isKeyboardVisible ? 'VISIBLE' : 'NOT VISIBLE'}',
      );
    }
  );

答案 6 :(得分:0)

您可以使用public IHttpActionResult PutAktivnost([FromBody] AktivnostEditVM aktivnost) { db.Entry(aktivnost).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); return Ok(); } 。只需查看下面的文档即可。

  
    

////屏幕的一部分完全被系统UI遮盖,///通常被设备的键盘遮盖。 /// /// 当一个     移动设备的键盘可见MediaQuery.of(context).viewInsets.bottom ///     对应于键盘的顶部。 /// ///此值为     与[padding]无关:两个值都是///     [MediaQuery]小部件边界的边缘。顶部的///     [WidgetsApp]创建的MediaQuery级别///与     包含应用程序的窗口(通常是移动设备屏幕)。 ///
    ///另请参见:/// /// * [MediaQueryData],它提供了一些     有关此///属性以及它与其他属性有何不同的其他详细信息     [填充]。最终的EdgeInsets viewInsets;

  

答案 7 :(得分:0)

您可以使用 keyboard_visibility 包有效地完成此操作,我已经使用过它了,它的作用就像魅力。

要安装

dependencies:
  keyboard_visibility: ^0.5.2

用法

import 'package:keyboard_visibility/keyboard_visibility.dart';

@protected
void initState() {
  super.initState();

  KeyboardVisibilityNotification().addNewListener(
    onChange: (bool visible) {
      print(visible);
    },
  );
}

它还支持show / hide之类的监听器。

here is the link

答案 8 :(得分:0)

使用 Flutter 2.0 和 null 安全性,我使用这个包 - 它没有流,纯飞镖,提供有关键盘高度等的附加信息。

https://pub.dev/packages/flutter_keyboard_size

enter image description here

答案 9 :(得分:0)

我使用了一种解决方法,我在输入中添加了一个 focusNode 并为其添加了一个侦听器。 在此处查看实现add focus listener to input

答案 10 :(得分:-1)

在这里找到一个更简单的解决方案:

将DesiredBottomWidget放入带有Stack()的{​​{1}}中,当键盘出现时它将被隐藏。

示例:

Positioned(top: somevalue)