当前位置: 首页 > news >正文

第四百四十四回

文章目录

  • 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进行页面重绘,有两种解决方法:更换接口,嵌套builderconst Positioned(top: 450,left: 0,width: 300,height: 56,child: TextField(),),],),);}

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

4. 内容总结

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

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

相关文章:

  • 一分钟了解:光伏无人机测绘的优势
  • 数据挖掘中的PCA和KMeans:Airbnb房源案例研究
  • leetcode 169.多数元素
  • Mybatis——一对多关联映射
  • docker从入门到熟悉
  • LabVIEW挖坑指南
  • Linux从入门到精通 --- 2.基本命令入门
  • 网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】
  • Cocos Creator 定时任务
  • JavaEE 初阶篇-生产者与消费者模型(线程通信)
  • ffmpeg Android 笔记
  • uni-app如何实现高性能
  • java——文件上传
  • C++读取.bin二进制文件
  • 掌握数据相关性新利器:基于R、Python的Copula变量相关性分析及AI大模型应用探索
  • C# 免费离线人脸识别 2.0 Demo
  • canvas 高仿 Apple Watch 表盘
  • CentOS7简单部署NFS
  • const let
  • ECMAScript入门(七)--Module语法
  • hadoop集群管理系统搭建规划说明
  • Java小白进阶笔记(3)-初级面向对象
  • js 实现textarea输入字数提示
  • js中的正则表达式入门
  • Leetcode 27 Remove Element
  • linux学习笔记
  • pdf文件如何在线转换为jpg图片
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 什么是Javascript函数节流?
  • 手写双向链表LinkedList的几个常用功能
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 写给高年级小学生看的《Bash 指南》
  • 怎么将电脑中的声音录制成WAV格式
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 国内开源镜像站点
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • $.ajax()参数及用法
  • (007)XHTML文档之标题——h1~h6
  • (13):Silverlight 2 数据与通信之WebRequest
  • (NSDate) 时间 (time )比较
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)docker:Dockerfile构建容器运行jar包
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .gitignore文件---让git自动忽略指定文件
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Project Open Day(2011.11.13)
  • .Net 代码性能 - (1)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET(C#) Internals: as a developer, .net framework in my eyes