首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

未检测到键盘。MediaQuery.of(context).viewInsets.bottom始终返回0.0

问题分析

当你在开发一个应用时,可能会遇到“未检测到键盘”的问题,这通常意味着你的应用无法正确识别键盘的弹出状态。MediaQuery.of(context).viewInsets.bottom返回0.0表示当前没有检测到键盘的插入(即键盘未弹出或者应用无法感知到键盘的状态)。

基础概念

  • MediaQuery: 是Flutter中用于获取屏幕相关信息的一个类,包括屏幕尺寸、方向、键盘插入状态等。
  • viewInsets: 表示屏幕边缘的插入区域,当键盘弹出时,底部的viewInsets会增大。

可能的原因

  1. 上下文问题:传递给MediaQuery.of(context)的上下文可能不正确或者已经失效。
  2. 生命周期问题:在某些生命周期阶段,如StatefulWidgetinitState方法中,可能无法获取到正确的键盘状态。
  3. 平台特定问题:某些平台可能有特定的行为导致键盘状态无法被正确检测。

解决方案

1. 确保上下文有效

确保你传递给MediaQuery.of(context)的上下文是有效的,并且是在构建方法中获取的。

代码语言:txt
复制
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final bottomInset = MediaQuery.of(context).viewInsets.bottom;
    return Container(
      // ...
    );
  }
}

2. 使用WidgetsBindingObserver

通过监听应用的生命周期事件,可以在键盘状态变化时获取到正确的viewInsets

代码语言:txt
复制
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

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

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      final bottomInset = MediaQuery.of(context).viewInsets.bottom;
      print('Bottom inset: $bottomInset');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // ...
    );
  }
}

3. 使用resizeToAvoidBottomInset

在某些情况下,你可以使用resizeToAvoidBottomInset属性来确保当键盘弹出时,内容会自动上移。

代码语言:txt
复制
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Keyboard Example'),
      ),
      body: SingleChildScrollView(
        child: Container(
          padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
          child: Column(
            children: <Widget>[
              // ...
            ],
          ),
        ),
      ),
      resizeToAvoidBottomInset: true,
    );
  }
}

应用场景

这个问题通常出现在需要根据键盘状态调整布局的应用中,例如聊天应用、表单输入等。

参考链接

通过以上方法,你应该能够解决“未检测到键盘”的问题,并正确获取到viewInsets.bottom的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter 小技巧之 MediaQuery 和 build 优化你不知道的秘密

上,如下图所示,在弹出键盘弹出键盘的情况下,可以看到 MediaQueryData 里一些参数的变化:viewInsets 在没有弹出键盘时是 0,弹出键盘之后 bottom 变成 336 padding...又和键盘状态有关系,所以:键盘的弹出可能会导致使用 MediaQuery.of(context) 的地方触发 rebuild,举个例子:如下代码所示,我们在 MyHomePage 里使用了 MediaQuery.of...(context).viewInsets.bottom ,模仿 Scaffold 里使用 MediaQuery在 MyHomePage 里使用 LikeScaffold ,并给 LikeScaffold...) {    print("####### LikeScaffold build ${MediaQuery.of(context).viewInsets.bottom}");    return Material...,也就是: LikeScaffold 虽然使用了 MediaQuery.of(context) ,但是它不再因为键盘的弹起而导致 rebuild 。

1.2K20
  • 如何在flutter中构建响应式布局(第五节)

    当检测到某些环境变化(称为特征)时,自动布局会根据指定的约束自动重新调整布局。 2. 尺码等级 大小类是根据大小自动分配给内容区域的特征。iOS 根据内容区域的大小类别动态调整布局。...{ Size screenSize = MediaQuery.of(context).size; Orientation orientation = MediaQuery.of(context...) { Size screenSize = MediaQuery.of(context).size; return Scaffold( body: Row(...) { Orientation deviceOrientation = MediaQuery.of(context).orientation; return Scaffold(...但是现在,如果您移动到特定屏幕然后在视图之间切换,您将丢失页面的上下文;也就是说,您将始终返回第一页,即 Chats。为了解决这个问题,我使用了多个回调函数将所选页面返回到HomePage.

    2.8K10

    Flutter 入门指北之基础部件

    Flutter App 接着看下 MyApp 这个类,继承自 StatelessWidget 并在 build 方法返回一个 MaterialApp 实例,(偷偷讲下,其实这边还可以返回 CupertinoApp...this.backgroundColor, // 界面的背景色 this.resizeToAvoidBottomPadding = true, // 避免 body 被底部弹出部件填充,例如输入法键盘...我们从上到下,通过构造函数来了解下各个 Widget的使用方法 AppBar AppBar({ Key key, this.leading, // 用于设置 AppBar 前置的按钮,例如设置返回我们需要的返回按钮等...left) this.locale, this.softWrap, // 当文字一行显示不完是否换行 this.overflow, // 如果超出限制的行数,以哪种方式省略展示的内容...(context).size 获取到的为上层容器的宽高 width: MediaQuery.of(context).size.width),

    1.3K30

    Python学习教程(二)

    print "新建一个文件" context = '''The best way to learn python contains two steps: 1....25.2 14.2 10.6 24.4 14.2 ENSG00000000938 0.0 0.0 0.0 0.0 0.0 ENSG00000001084...用到的知识点 11.写程序 collapsemiRNAreads.py转换smRNA-Seq的测序数据 输入文件格式(mir.collapse, tab-分割的两列文件,第一列为序列,第二列为序列被测到的次数...中的序列比对到ref.fa, 输出短序列匹配到ref.fa文件中哪些序列的哪些位置 find 用到的知识点 输出格式 (输出格式为bed格式,第一列为匹配到的染色体,第二列和第三列为匹配到染色体序列的起始终止位置...此外,对于不同的思路并不是所有提到的知识点都会用着,而且也可能会用到提到的知识点。但是所有知识点都在前面的讲义部分有介绍。

    1.4K80

    Android适配全面总结(三)----ROM适配

    3、华为手机获取拍照权限后拍照,返回值为空 问题起源: 开发中遇到了需要拍照和从图库中选择图片展示并上传的功能,其他手机测试没问题,华为手机获取拍照权限后拍照,返回值为空。...问题分析: 原来是华为在7.0以后的系统中,对于拍照后返回的图片也做了权限处理。...◆ 方式2:拨号键盘 + 快捷键设置(这种方式不是所有log都能显示) 进入拨号界面输入:*#*#2846579#*#* 依次选择:后台设置 ---> LOG设置 ---> AP 日志,重新启动手机。..., 0.0f); path.lineTo(0.0f, (float) h); path.arcTo(new RectF(0.0f, 0.0f, ((float)...R.string.account_toast_not_open_camera, Toast.LENGTH_SHORT).show(); // showTip("您允许

    2K10

    Android 天气APP(二)获取定位信息

    ; /** * 消息提示工具类 */ public class ToastUtils { public static void showLongToast(Context context,...得到权限之后开始定位 } else {//申请失败 ToastUtils.showShortToast(this, "权限开启...这个方法和onCreate是平级的,你只要是写在MainActivity的{}里面,想放那里就放那里 ⑤ 实现BDAbstractLocationListener接口 /** * 定位结果返回...location.getLongitude(); //获取经度信息 float radius = location.getRadius(); //获取定位精度,默认值为0.0f...运行一下,请运行在自己的手机上,别使用虚拟机和模拟器(PS: 如果你运行报错了,请把你的错误信息贴出来,我好判断是什么问题) 点击 仅使用期间允许或者始终允许 之后就可以得到定位地址了。

    1.9K30

    《Flutter》-- 6.高级组件

    semanticChildCount,//子项数量 DragStartBehavior dragStartBehavior = DragStartBehavior.down,//开始处理拖拽行为的方式,默认为检测到拖拽手势时开始处理...maxScrollExtent:最大可滚动长度; extentBefore:距离滚出视图窗口顶部的长度; extentInside:视图窗口内部长度,大小等于屏幕显示的列表长度; extentAfter:列表中滑入视图窗口部分的长度...const [],//PageView的列表项 this.dragStartBehavior = DragStartBehavior.down,//处理拖拽开始行为的方式,默认为检测到拖拽手势时开始执行滚动拖拽行为...oldDelegate) { return true;//是否需要执行重绘 } } 示例效果: 创建Flutter自绘组件时,可以做以下两点性能优化: 1)尽可能利用好shouldRepaint()的返回值...如果绘制的内容不需要依赖外部状态,返回false即可;如果绘制过程需要依赖外部状态,可以在shouldRepaint()中判断依赖的状态是否改变,如果已改变,则返回true并执行重绘操作,反之则返回false

    10.6K20

    万字长文详解如何用Python玩转OpenGL | CSDN 博文精选

    世界坐标系(World Coordinates) 世界坐标系是右手坐标系,以屏幕中心为原点(0, 0, 0),且是始终不变的。 ?...GLUT 库提供了几个函数帮我们捕捉鼠标事件、键盘事件和窗口事件: glutMouseFunc() 该函数捕捉鼠标点击和滚轮操作,返回4个参数给被绑定的事件函数:键(左键/右键/中键/滚轮上/滚轮下)...glutKeyboardFunc(keydown) 该函数捕捉键盘按键被按下,返回3个参数给被绑定的事件函数:被按下的键,x坐标、y坐标 glutReshapeFunc() 该函数捕捉窗口被改变大小,...VBO 将顶点信息放到 GPU 中,GPU 在渲染时去缓存中取数据,二者中间的桥梁是 GL-Context。...GL-Context 整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context 就负责在他们之间进行切换。

    9.1K21

    写给 python 程序员的 OpenGL 教程

    世界坐标系(World Coordinates) 世界坐标系是右手坐标系,以屏幕中心为原点(0, 0, 0),且是始终不变的。...GLUT 库提供了几个函数帮我们捕捉鼠标事件、键盘事件和窗口事件: glutMouseFunc() 该函数捕捉鼠标点击和滚轮操作,返回4个参数给被绑定的事件函数:键(左键/右键/中键/滚轮上/滚轮下...或者 GLUT_ENTERED glutKeyboardFunc(keydown) 该函数捕捉键盘按键被按下,返回3个参数给被绑定的事件函数:被按下的键,x坐标、y坐标 glutReshapeFunc...VBO 将顶点信息放到 GPU 中,GPU 在渲染时去缓存中取数据,二者中间的桥梁是 GL-Context。...GL-Context 整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context 就负责在他们之间进行切换。

    3.2K30

    SORT 多目标跟踪算法笔记

    文章要点为: 以 IoU 作为前后帧间目标关系度量指标; 利用卡尔曼滤波器预测当前位置; 通过匈牙利算法关联检测框到目标; 应用试探期甄别虚; 使用 Faster R-CNN,证明检测好跟踪可以很简单...关联检测到目标后,用检测到的边界框更新目标状态,其中速度分量通过卡尔曼滤波器框架进行优化求解。如果没有与目标相关的检测,则使用线性速度模型简单地预测其状态而不进行校正。...如果 T L o s t T_{Lost} TLost​ 帧测到,则终止轨迹。这可以防止跟踪器数量的无限增长以及由于无检测校正下预测时间过长而导致的定位错误。...返回一个类似的数组,其中最后一列是对象 ID。 注意:返回的对象数可能与提供的检测数不同。...自后向前遍历,仅返回在当前帧出现且命中周期大于self.min_hits(除非跟踪刚开始)的跟踪结果;如果命中时间大于self.max_age则删除跟踪器。

    3.2K30
    领券