Flutter 颤振键盘听隐藏和显示
我如何才能听到键盘是显示还是隐藏 我试过这个例子 但不幸的是,它不起作用。你知道怎么能听到键盘的变化吗Flutter 颤振键盘听隐藏和显示,flutter,Flutter,我如何才能听到键盘是显示还是隐藏 我试过这个例子 但不幸的是,它不起作用。你知道怎么能听到键盘的变化吗 当我按键盘上的“完成”键时,它似乎可以工作。但如果我按回手机,它不会转到“键盘已解除”,因为焦点仍然存在。。有什么帮助吗?不确定这有多可靠,但在: 检查build()方法中的viewInsets.vertical是否大于零,我得到了正确的结果: @override Widget build(BuildContext context) { bool isKeyboardSho
当我按键盘上的“完成”键时,它似乎可以工作。但如果我按回手机,它不会转到“键盘已解除”,因为焦点仍然存在。。有什么帮助吗?不确定这有多可靠,但在: 检查
build()
方法中的viewInsets.vertical
是否大于零,我得到了正确的结果:
@override
Widget build(BuildContext context) {
bool isKeyboardShowing = MediaQuery.of(context).viewInsets.vertical > 0;
return SafeArea(
child: Scaffold(
body: Column(
children: <Widget>[
Text(isKeyboardShowing ? 'YES!' : 'NO!'),
TextField(),
],
),
),
);
}
@覆盖
小部件构建(构建上下文){
bool isKeyboardShowing=MediaQuery.of(context).viewInsets.vertical>0;
返回安全区(
孩子:脚手架(
正文:专栏(
儿童:[
文本(iskeyboard显示“是!”:“否”),
TextField(),
],
),
),
);
}
将此检查与其他检查(例如输入焦点)结合起来可能是一个好主意,以避免误报。您发现拼写错误了吗
FocusNode _myNode = new FocusNode()..addListener(_listner);
应该是:
FocusNode _myNode = new FocusNode()..addListener(_listener);
每当用户按下或释放键盘上的键时调用回调的小部件 RawKeyboardListener用于侦听表示为键的原始键事件和硬件按钮。通常由游戏和其他应用程序使用,这些应用程序将键盘用于文本输入以外的目的
文本输入,考虑使用EdababelExt,它与屏幕键盘和输入法编辑器(IMES)集成。 简单解释:MediaQuery了解当前媒体的大小。此类使用asMediaQueryData media=MediaQuery.of(上下文)。如果屏幕上出现任何视图MediaQuery.of(context).viewsinsets给出该视图高度的一些值。由于键盘是从屏幕底部显示的,所以我使用MediaQuery.of(context.viewInsets.bottom,这给了我屏幕上键盘的高度。当键盘未显示时,此值为0。此解决方案肯定有效。
KeyboardVisibilityBuilder 使用WidgetsBindingObserver
mixin可以监听键盘显示/隐藏事件。我准备了KeyboardVisibilityBuilder
小部件来为您处理行为。用法与AnimatedBuilder
非常相似:
返回键盘可见性生成器(
生成器:(上下文、子项、isKeyboardVisible){
如果(isKeyboardVisible){
//构建可视键盘的布局
}否则{
//构建不可见键盘的布局
}
},
child:child,//此小部件转到生成器的子属性。为获得更好的性能而设计。
);
KeyboardVisibilityBuilder
实现:
///在键盘上调用“builder”关闭/打开。
/// https://stackoverflow.com/a/63241409/1321917
类KeyboardVisibilityBuilder扩展StatefulWidget{
最后一个孩子;
最终小部件功能(
构建上下文上下文,
孩子,
布尔是键盘可见,
)建筑商;
常量键盘可见性生成器({
关键点,
这个孩子,
@需要这个.builder,
}):super(key:key);
@凌驾
_KeyboardVisibilityBuilderState createState()=>\u KeyboardVisibilityBuilderState();
}
类_键盘可见性BuilderState扩展状态
使用WidgetsBindingObserver{
var _isKeyboardVisible=假;
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(这个);
}
@凌驾
无效处置(){
WidgetsBinding.instance.removeObserver(此);
super.dispose();
}
@凌驾
void didChangeMetrics(){
final bottomInset=WidgetsBinding.instance.window.viewInsets.bottom;
最终新值=底部插图>0.0;
如果(newValue!=\u iskeyboard可见){
设置状态(){
_isKeyboardVisible=新值;
});
}
}
@凌驾
小部件构建(BuildContext上下文)=>Widget.builder(
上下文
小朋友,
_键盘是否可见,
);
}
您找到解决方案了吗?可以确认这在TextFormFields
上对我不起作用吗?也可以使用onPop
检测“backButton”(后退按钮)带凹口的手机是否在此处给出假阳性?已编辑。我想现在每个人都可以学到一些东西@Nicohaase使用mixin是一个好主意,因为我们也可以将它与providerI一起使用。我可以在键盘关闭时使用它来验证输入字段,而不是在按下应用按钮时使用它
FocusNode _myNode = new FocusNode()..addListener(_listner);
FocusNode _myNode = new FocusNode()..addListener(_listener);
const RawKeyboardListener({
Key key,
@required FocusNode focusNode,
@required ValueChanged<RawKeyEvent> onKey,
@required Widget child
})
const RawKeyboardListener({
Key key,
@required this.focusNode,
@required this.onKey,
@required this.child,
}) : assert(focusNode != null),
assert(child != null),
super(key: key);
if (MediaQuery.of(context).viewInsets.bottom > 0.0) {
// keyboard on the screen
}