Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振键盘听隐藏和显示_Flutter - Fatal编程技术网

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
}