第四百四十四回

2024-04-07 08:52
文章标签 四十四 第四

本文主要是介绍第四百四十四回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 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的优化"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

这篇关于第四百四十四回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882154

相关文章

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

C语言深度剖析--不定期更新的第四弹

哈哈哈哈哈哈,今天一天两更! void关键字 void关键字不能用来定义变量,原因是void本身就被编译器解释为空类型,编译器强制地不允许定义变量 定义变量的本质是:开辟空间 而void 作为空类型,理论上不应该开辟空间(针对编译器而言),即使开辟了空间,也只是作为一个占位符看待(针对Linux来说) 所以,既然无法开辟空间,也无法作为正常变量使用,既然无法使用,干脆编译器不让它编译变

猫猫学iOS(四十四)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

猫猫分享,必须精品 原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一下操作。 代码: 话不多说,先

尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)

目录: (1)改造商品搜索上下架 (2)延迟消息 (1)改造商品搜索上下架 定义商品上下架常量 在rabbit-util模块中导入常量类MqConst。 /*** 商品上下架.*/public static final String EXCHANGE_DIRECT_GOODS = "exchange.direct.goods";public static final Str

第四讲:拟合算法

与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线)使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。 插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。 尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到-个确定的曲线,尽管这条曲线不能经过每

(第四十天)配置完整的考试系统,完成前端和后端并优化,mysql后端,nginx前端,java连接

回顾 1 、使用 harbor 仓库 python --version yum -y update yum -y install python2-pip pip install --upgrade pip == 20 .3 -i ....... pip install docker-compose -i .......

搭建大型分布式服务(四十四)SpringBoot 无代码侵入实现多Kafka数据源:单分区提升至十万级消费速度!

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 在过去的一段时间里,我们利用了AI大模型写了一个多线程并发框架,那么,我们怎样集成到Kafka组件里,让消费速度提升N倍呢? 《AI大模型编写多线程并发框架(六十一):从零开始搭建框架》《AI大模型编写多线程并发框架(六十二):限流和并发度优化》《

小白Sass教程---通过实例学Sass--第四讲--属性嵌套

CSS规则在sass中可以进行嵌套,css属性也可以进行嵌套,属性嵌套的规则是: 有中横线的属性可以拆解嵌套,以中横线为界限进行拆解,依次嵌套 废话不多说,直接上代码: .lesson3-demo2{.box{height: 100px;width: 800px;padding: {top: 20px;left: 30px;}border: {left: 5px solid #3da7f5

sqli-libs第四关详解

首先判断是数字型注入还是字符型注入 正常显示,说明是字符型注入,那么尝试单引号闭合 还是正常显示,尝试双引号闭合 有报错信息,含有括号,这时就应该想到,sql代码是("$id")这样写的了。直接采取闭合,判断字段数。 4不行,那就是3个字段,再看看哪些地方可以显示数据,把数据库名和版本也搞出来 后面就是利用information_schema这个库查询信息了,先看看s

数字芯片设计验证经验分享系列文章(第四部分):将ASIC IP核移植到FPGA上——如何测试IP核的功能和考虑纯电路以外的其他因素

作者:Philipp Jacobsohn,SmartDV首席应用工程师 Sunil Kumar,SmartDV FPGA设计总监 本系列文章从数字芯片设计项目技术总监的角度出发,介绍了如何将芯片的产品定义与设计和验证规划进行结合,详细讲述了在FPGA上使用IP核来开发ASIC原型项目时,必须认真考虑的一些问题。文章从介绍使用预先定制功能即IP核的必要性开始,通过阐述开发ASIC原型设计时需要考