我的应用最上层有一个BottomNavigationBar
。我想在app / subtree的任何地方检测键盘打开/关闭,这样只要键盘可见,我就可以显示/隐藏BottomNavigationBar
。
这是一般性问题,可能与BottomNavigationBar
没有直接关系。换句话说,摘自BottomNavigationBar
: - )
答案 0 :(得分:8)
我刚刚创建了一个flutter插件来通知键盘打开/关闭事件。在Android和iOS上均可使用。希望这会有所帮助
答案 1 :(得分:8)
如果您不想依赖外部库,则可以使用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之类的监听器。
答案 8 :(得分:0)
使用 Flutter 2.0 和 null 安全性,我使用这个包 - 它没有流,纯飞镖,提供有关键盘高度等的附加信息。
答案 9 :(得分:0)
我使用了一种解决方法,我在输入中添加了一个 focusNode 并为其添加了一个侦听器。 在此处查看实现add focus listener to input
答案 10 :(得分:-1)
在这里找到一个更简单的解决方案:
将DesiredBottomWidget放入带有Stack()
的{{1}}中,当键盘出现时它将被隐藏。
示例:
Positioned(top: somevalue)