第四百五十三回

文章目录

  • 1. 问题描述
  • 2. 优化方法
    • 2.1 缩小范围
    • 2.2 替代方法
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容,本章回中将介绍关于MediaQuery的优化.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 问题描述

我们在前面章回中介绍获取屏幕参数时使用过MediaQuery类,主要通过它来获取MediaQueryData对象,然后从MediaQueryData对象中获取屏幕相关的参数。比如
常用的屏幕长度和宽度,不过在使用时如果遇到键盘弹出或者隐藏时会引起Scaffold进行重绘(rebuild),而且是多次重绘,这种重绘显然不合理,它会导致不必要的
性能开销,本章回中将介绍如何优化这种不合理的重绘。

2. 优化方法

明白我们遇到的问题后,我们介绍如何去解决这个问题,我们提供了两种解决方法,在接下来的小节中将介绍这两种方法。

2.1 缩小范围

我可以在使用MediaQuery的地方嵌套一个Build组件,这样可以让重绘只发生在Build组件内部,进而不影响页面中其它的组件。这种做法相当是缩小了重绘范围。

2.2 替代方法

我们还可以使用MediaQuery.sizeof()代替原来的方法,不过这种办法有一定的局限性,比如viewInsetOf方法就没有效果。它仍然会进行重绘。我推测它需要计算
键盘高度,因此才去重绘。不过只是推测而已,真实的原因还需要查看源代码后才能明白。

3. 示例代码

 Widget build(BuildContext context) {
    // double screenWidth = MediaQuery.of(context).size.width;
    // double screenHeight = MediaQuery.of(context).size.height;

    ///使用下面的方法代替上面的方法,可以减少页面重绘
    double screenWidth = MediaQuery.sizeOf(context).width;
    double screenHeight = MediaQuery.sizeOf(context).height;
    debugPrint("build running");
    ///键盘高度,没有键盘弹出时为0
    // debugPrint("keyboard 1: ${MediaQuery.of(context).viewInsets.bottom}");
    ///这个方法不会减少页面重绘,可见只对sizeof有效果。
    // debugPrint("keyboard 1: ${MediaQuery.viewInsetsOf(context).bottom}");
    ///底部安全区域高度,没有时为0
    // debugPrint("keyboard 2: ${MediaQuery.of(context).viewPadding.bottom}");
    ///没有实际意义
    // debugPrint("keyboard 3: ${MediaQuery.of(context).viewInsets.top}");
    ///顶部状态栏的高度
    // debugPrint("keyboard 4: ${MediaQuery.of(context).viewPadding.top}");

    return Scaffold(
     appBar: AppBar(
       title: const Text("Example of Scaffold Overlay"),
     ),
      body: Stack(
        children: [
          Positioned(
            top: 400,
            left: 0,
            ///嵌套一层builder就不会引起页面重绘
            child: Builder(builder: (context) {
              double y = MediaQuery.of(context).size.height;
              debugPrint("build running of builder");
              return Text("check rebuilding value: ${y.toString()}");
            }),
          ),
          ///键盘自动弹出时会导到MediaQuery进行页面重绘,有两种解决方法:更换接口,嵌套builder
          const Positioned(
            top: 450,
            left: 0,
            width: 300,
            height: 56,
            child: TextField(),
          ),
        ],
      ),
    );
  }

上面的示例代码中大量使用了MediaQuery类,在页面中包含一个输入框,当我们点击输入框时会自动弹出键盘,此时可以看到代码中添加的日志出现在了运行结果中,
这表明页面发生了生绘,具体点讲就是build方法在运行,而且会运行多次,输入完成后,点击键盘上的确认键,键盘会自动隐藏,此时也会发生重绘。我们使用上一小
节介绍的两种优化方法后,再次在输入框中输入内容,此时,页面不会发生重绘。我在这里就不演示具体的运行结果了,建议大家自己动手去实践。

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:

  • 页面中使用MediaQuery类后,当键盘自动弹出和隐藏时会引起页面重绘;
  • 使用Build组件来缩小重绘范围,这样可以避免页面发生重绘;
  • 使用MediaQuery中的其它方法可以避免重绘,不过不是所有方法都有效果;
    看官们,与"关于MediaQuery的优化"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535152.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习】移动端兼容性测试有什么方法及重要性

随着移动互联网的快速发展,移动应用程序已经成为人们日常生活中不可或缺的一部分。然而,由于各种移动设备的硬件和软件差异,移动应用程序的兼容性问题也越来越突出。因此,移动端兼容性测试成为了一个重要的环节,它可以…

超越ChatGPT,国内快速访问的强大 AI 工具 Claude

claude 3 opus面世后,网上盛传吊打了GPT-4。网上这几天也已经有了许多应用,但竟然还有很多小伙伴不知道国内怎么用gpt,也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

Flyway Desktop 连接使用教程

!!!这是到新的项目组,别人都配置好了,我只是用工具连接的教程,具体怎么和项目配置,请自行查阅。 1.下载软件 官网地址Home - Product Documentation 2.New project 3.创建Flyway工作路径 4.添…

CorelDRAW21.2.4中文最新官方和谐版下载

CorelDRAW是一款由加拿大Corel公司出品的平面设计软件,也被称为CDR。它是一款功能强大的矢量图形制作和排版软件,主要面向绘图设计师和印刷输出人员。该软件提供了矢量插图、页面布局、图片编辑和设计工具,广泛应用于排版印刷、矢量图形编辑及…

DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署

VMware vCenter Server与ESXI版本兼容对照表 ESXI下载 VMware vcenter7.0许可证 Esxi7.0许可证 VSAN 7.0许可证 DELL VMWare R730 R740 R750 iDRAC配置与ESXI安装部署 vmware vcenter server 7.0 安装教程 1. 进入BIOS界面配置iDRAC网络 开机按F10,开机点击F10选择…

java八股——消息队列MQ

上一篇传送门:点我 目前只学习了RabbitMQ,后续学习了其他MQ后会继续补充。 MQ有了解过吗?说说什么是MQ? MQ是Message Queue的缩写,也就是消息队列的意思。它是一种应用程序对应用程序的通信方法,使得应用…

AI大模型专题:2024大模型赋能下的AI 2.0数字人平台白皮书

今天分享的是AI大模型专题系列深度研究报告:《AI大模型专题:2024大模型赋能下的AI 2.0数字人平台白皮书》。 (报告出品方:商汤) 关键发现 生成式 AI 和大模型技术的飞速发展正推动 AI数字人向更高级别进化&#xff…

JavaScript_语法--变量

1.4 变量 变量:一小块存储数据的内存空间 Java语言是强类型语言,而JavaScript是弱类型的语言 强类型: 在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据 弱类型: 在开辟变量存储空间…

GeoServer:忘记密码重置

操作步骤 1. 找到data_dir/security/usergroup/default目录下的users.xml文件, 2.修改password为plain:geoserver, 这里无论原来的密码是什么,改为plain:geoserver之后,就可以通过admin:geoserver默认账户密码登录了。…

3d模型有边界框怎么去除---模大狮模型网

在3D建模软件中,边界框通常是用来表示模型的边界和外轮廓的,但有时候在渲染或导出模型时可能不希望显示这些边界框。以下是一些去除3D模型边界框的方法: 隐藏边界框选项: 在大多数3D建模软件中,边界框的显示可以通过简…

【电子通识】普通电阻、敏感电阻、可调电阻的种类和特点

电阻的作用 在【分立元件】理解电阻 中我们知道电阻是在电路中对电流产生阻碍作用的元件。电阻是电子产品中最基本、最常用的电子元件之一。 有各产品的电路板中基本都有电阻器,通常起限流、滤波或分压等作用。实际上,电阻器的种类很多,根据其…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤: 1、调整文件编码:确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下,使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

高阶流程图(SIPOC)

SIPOC高阶流程图是一种流程映射和改进方法,它使用可视化的方式描述一个或多个流程的输入和输出。SIPOC是五个单词的首字母缩写,分别代表供应商(Suppliers)、输入(Inputs)、过程(Processes&#…

Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor OIDC 单点登录授权实例2-登录信息组件wasmBlazor OIDC 单点登录授权实例3-服务端管理组件Blazor OIDC 单点登录授权实例4 …

Hadoop安装部署-NameNode高可用版

Hadoop分布式文件系统支持NameNode的高可用性,本文主要描述NameNode多节点高可用性的安装部署。 如上所示,Hadoop分布式文件系统部署了NameNode的Master主节点以及NameNode的Slave副节点,当Master主节点发生故障变得不可用时,ZooK…

建筑业AI的崛起

建筑领域完全可以从机器学习和人工智能(AI)的出现中受益。 本文总结了这一领域的发展,并介绍了人们可以准备从这项技术中实现价值最大化的一些方法,包括对人工智能和机器学习在建筑中的一些应用及其潜在影响的广泛调查。 这些流程…

基于springboot的医院药品管理系统

前言 基于Java的医院药品管理系统是一个利用JAVA技术建设的网上管理系统,在基于Java的医院药品管理管理中实现信息化。系统的设计就是为了迎合广大用户需求而创建的一个界面简洁、有定向内容、业务逻辑简单易操作的基于Java的医院药品管理系统。本文以基于Java的医…

【论文解读】大模型事实性调查(下)

http://t.csdnimg.cn/4md5U 上期我们分享了《大模型事实性调查》论文解读的前半部分,这一期为大家带来后面的内容,欢迎阅读交流。 四、事实性分析 在前面的第3节中,论文提供了与评估事实性相关的定量统计数据。在本节中,论文将更…

2024年第15届蓝桥杯嵌入式组注意事项之新建LCD工程

2024年第15届蓝桥杯嵌入式组注意事项之新建LCD工程 今天是2024年4月11日,距离蓝桥杯比赛还有一天开始,几日前本人拿到了今年赛场的资源包,发现了一点的变化 首先是文件夹的结构往年有所不同 最重要的变化还是LCD的例程的变化,往年…

记录vite打包并上传到npm

开始 起因:我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以!又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…