第四百五十四回

news2024/11/15 12:48:59

文章目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

package.java文件的作用

你查看springboot的源码,有很多类都有这个文件,在idea不能创建,因为不支持这种命名,只能用记事本创建后复制都项目中。 主要应用是给类添加正常,或者把公用的注解都放到这里,常量不合适,作用范…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道,这个页面本身没有新闻信息,是…

夜月一帘幽梦,春风十里“三指针法“ (链表面试题篇2)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

Gemini国内怎么使用

GPT、Claude、Gemini全系列模型国内使用方法来了! 一直以来很多人问我能不能有个稳定,不折腾的全球AI大模型测试网站,既能够保证真实靠谱,又能够保证稳定、快速,不要老动不动就挂了、出错或者漫长的响应。 到目前为止…

深度学习入门(3)

一、感知机 感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。 但是,和实际的电 流不同的是,感知机的信号只有“流 / 不流”( 1 / 0 )两种取值。在本书中&…

FFmpeg: 自实现ijkplayer播放器--03UI界面设计

文章目录 UI设计流程图UI设计界面点击播放功能实现 UI设计流程图 UI设计界面 主界面 控制条 播放列表 画面显示 标题栏 设置界面 提示框 点击播放功能实现 槽函数实现: connect(ui->ctrlBarWind, &CtrlBar::SigPlayOrPause, this, &Main…

vue表格操作列,按钮太多显示... 点击后悬浮显示全部按钮

效果: 分析原理: 一共就三步,仔细看看很简单,位置要加对,代码结构下边有demo 代码结构demo: <el-table-columnlabel"操作"align"center"fixed"right"show-overflow-tooltip><template slot-scope"scope"><el-buttonsi…

绿色地狱steam叫什么 绿色地狱steam怎么搜

绿色地狱steam叫什么 绿色地狱steam怎么搜 《绿色地狱》是一款以亚马逊雨林为背景的开放世界生存模拟游戏。玩家们扮演一名被困在丛林中的冒险者&#xff0c;玩家在游戏内需要学习采集资源、建造庇护所、狩猎和烹饪食物&#xff0c;同时要面对丛林中的危险和挑战&#xff0c;…

Java入门学习Day05

本篇文章主要有创建package、关系运算符、逻辑运算符、三元运算符和其对应的实例。 一、创建package 创建一个包&#xff0c;把我们之前或之后用到的运算符代码都放到这个package里&#xff0c;方面管理。 包的命名通常是公司的网站名称倒着写(com.mayin)&#xff0c;再加上…

简析|抖音隋总分享的人力RPO项目怎么样?

在抖音这个充满活力和创新的平台上&#xff0c;隋总以其独到的见解和深刻的行业洞察&#xff0c;吸引了众多粉丝的关注。最近&#xff0c;隋总分享的人力RPO项目引起了广泛关注&#xff0c;那么&#xff0c;这个项目究竟怎么样呢? 首先&#xff0c;人力RPO&#xff0c;即招聘流…

前端开发攻略---JS将class转换为function。满分写法无死角

1、class写法 class Example {constructor(name) {this.name name}func() {console.log(this.name)}} 2、function写法 use strictfunction Example(name) {if (!new.target) {throw new TypeError(Class constructor Example cannot be invoked without new)}this.name name…

Web 前端 Javascript笔记2

1、数组 为什么需要数组&#xff1a;因为变量只能存储一条数据&#xff0c;但是储存多条数据 数组的声明方式 1、new let a1new Array() console.log(a1) 2、字面量 let a2[1,2,4,"k",true,"zhangsan",11] console.log(a2) 数组里面可以存放不同的数据类…

html--烟花3

html <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Canvas烟花粒子</title> <meta name"keywords" content"canvas烟花"/> <meta name"description" content"can…

013_NaN_in_Matlab中的非数与调试方法

Matlab中的非数与调试方法 是什么&#xff1f; Matlab编程&#xff08;计算器使用&#xff09;中经常有个错误给你&#xff0c;这句话里可能包含一个关键词NaN。大部分学生都有过被 NaN 支配的痛苦记忆。 NaN 是 Not a Number 的缩写&#xff0c;表示不是一个数字。在 Matla…

00_STM32CubeMX如何新建一个工程

STM32CubeMX如何新建一个工程 STM32CubeMX如何新建一个工程以使用PA1口点亮LED为例子 STM32CubeMX如何新建一个工程 以使用PA1口点亮LED为例子 1.创建一个新工程 2.搜索芯片&#xff0c;然后双击 3.点击PA1引脚&#xff0c;设置为输出口 4.文件一定要保存到英文路径&#xff…

Normalizing Flows

需要学的是神经网络 f f f, 用于完成从source distribution (Pz)&#xff08;latent space&#xff0c;一般为高斯分布&#xff09;到 target distribution (Px) 的映射。 Normalizing Flows 是一种强大的生成模型&#xff0c;它通过学习一个可逆且易于计算的转换来将复杂的概…

Linux多进程开发2 - 进程间通信

1、进程间通信的概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的&#xff0c;没有关联&#xff0c;不能在一个进程中直接访问另一个进程的资源。但是&#xff0c;进程不是孤立的&#xff0c;不同的进程需要进行信息的交换和状态的传递等&…

【Datawhale LLM学习笔记】一、什么是大型语言模型(LLM)

文章目录 1. 什么是大模型2. 检索增强生成 RAG一、什么是 RAG二、RAG 的工作流程 3. langChain介绍一、什么是 LangChain二、LangChain 的核心组件 4. 开发 LLM 应用的整体流程一、何为大模型开发二、大模型开发的一般流程三、搭建 LLM 项目的流程简析&#xff08;以知识库助手…

明日周刊-第6期

最近一周杭州的天气起起伏伏&#xff0c;下雨就凉&#xff0c;不下雨就热。但是夏天的感觉确实是越来越浓烈了&#xff0c;又是一年夏&#xff0c;在这个夏天大家都有什么新的计划呢。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、我国自主研发科技壮举震惊全球航天界…

SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计 一&#xff1a;产品原型 在菜品列表页面&#xff0c;每个菜品后面对应的操作分别为修改、删除、停售&#xff0c;可通过删除功能完成对菜品及相关的数据进行删除。 删除菜品原型&#xff1a; 业务规则&#xff1a; 可以一次删除一个菜品&#xff0c;也可以批…