Flutter 调试工具篇 | 壹 - 使用 Flutter Inspector 分析界面


theme: cyanosis

1. 前言

很多朋友可能在布局过程中、或者组件使用过程中,会遇到诸如颜色、尺寸、约束、定位等问题,可能会让你抓耳挠腮。俗话说,磨刀不误砍柴工,会使用工具是非常重要的,其实 Flutter 提供了强大的调试工具,可以辅助我们去查看界面布局中的一切细节。

基于这些细节,可以很轻松地去解决布局相关的疑难杂症。 也能让我们对界面的布局有更深刻的认知,这就是 : Flutter Inspector ,如果你使用 AndroidStudio,可以在如下的侧栏选项卡中打开:

image.png


光秃秃地介绍如何使用的话,或许太过无聊;下面就通过一个实际的小问题的解决过程,来讲述一下如何通过 Flutter Inspector 来分析界面结构和寻找关键源码。如下所示,左下角的菜单弹框,在 useMaterial3 下呈紫色,而 PopupMenuButton 并没有直接修改弹出框背景色的配置项。接下来将通过布局分析器,来解决如下几个问题:

  1. PopupMenuButton 弹出菜单,其背景是何时、如何着色的。
  2. 如何修改弹出菜单的背景色。
  3. 弹出菜单在界面树形结构中,处于哪个层级。

image.png

本文具体源码就不贴了,跑起来之后和本文一起使用 Flutter Inspector 来分析。源码地址在:

LoveNote520/LoveNote: 提交节点


2. Flutter Inspector 窗口基本介绍

首先,需要将应用运行起来, Flutter Inspector 才能展示信息。如下所示,映入眼帘的主要有三个部分

[1]. 顶部的操作工具栏。
[2]. 左侧的组件树信息。
[3]. 右侧的选中组件的详情信息。

image.png

首先强调一下,左侧的树形结构中每个组件条目,对应着右侧的一个面板。也就是说,你每当点击一个左侧组件树中的节点,右侧的面板信息就会更新:

154.gif

其中右侧面板 Layout Explorer 可视化地展示出:

[1]. 当前组件对应的渲染对象树,受到的 父级约束
[2]. 当前组件对应的渲染对象树,其在界面中的 尺寸
[3]. 当前组件对应的渲染对象树,向子级的 传递约束

如果看过 《Flutter 布局探索 - 薪火相传》 的朋友,不难理解,对于布局来说 父级约束尺寸传递约束 这三者是何其重要。而 Layout Explorer 可视化地将这些信息展示出来,就非常便于我们去分析布局的细节。


在面板右侧,有一个 Widget Datails Tree 的选项卡,是极其重要而有用的。同样,你每当点击一个左侧组件树中的节点,Widget Datails Tree 信息也会更新。其中可以展示某个 Widget 构建过程中的所有细节,包括 dependencies 依赖、state 状态类、properties 调试属性、Widget 派生类的所有属性。

以及最重要的 某个 Widget 对应的渲染对象 renderObject,从渲染对象中,可以进一步分析约束、尺寸、数据等信息。细致入微地去了解当前界面中展示的逻辑,这样从内部寻找病因,就能更精准地对症下药。

image.png


3. 选择模式与具体组件分析

选择模式 Select Widget Model 是一个非常好用的工具。如下所示,点击之后,可以在应用界面中点一下,面板在就可以自动选中被点击的组件。这就可以大大提高查看界面视图中每个组件构建信息的效率,不必一个个自己手动去找。

155.gif


如下所示,往上翻一下,就可以很容易定位到颜色的来源,PopupMenuButton 弹出框的视图,由源码内部的 _PopupMenu 组件所构建,其中背景色由 Material 组件所设置。

image.png

所以,此时全局搜索一下 _PopupMenu 组件,看看使用 Material 组件时颜色怎么传递的就可以了。如下所示,颜色值是三个:依次取用 路由颜色、弹框主题色、默认颜色。

image.png

从源码中不难看出,PopupMenuTheme 可以设置这里的背景颜色;如果没有主题色,将会取用 defaults 主题数据,这里根据 useMaterial3 来确定的,这就是主题中 useMaterial3 可以影响弹框颜色的根本原因。

dart ---->[_PopupMenu#build]---- final ThemeData theme = Theme.of(context); final PopupMenuThemeData popupMenuTheme = PopupMenuTheme.of(context); final PopupMenuThemeData defaults = theme.useMaterial3 ? _PopupMenuDefaultsM3(context) : _PopupMenuDefaultsM2(context);


3. 修改弹框颜色

有了上面的布局、源码分析之后,弹出框的背景色就很好修改了: 如下所示,提供 popupMenuTheme ,设置白色背景即可:

dart theme: ThemeData( fontFamily: 'aldk', colorSchemeSeed: const Color(0xff6750a4), popupMenuTheme: PopupMenuThemeData( color: Colors.white, ), useMaterial3: true, ),

如下所示,color 虽然设成了白色,但是弹框背景肉眼看起来很明显不是白色。不过看起来没有之前那么紫了,也就是说只设置 popupMenuTheme 的颜色,有一点用,但是不多。这是什么原因呢?

image.png

前面说了,一切界面展示中存在的问题,都可以通过 Flutter Inspector 来分析。可以先用拾色器看一下,颜色是 F3F1F7,确实不是白色。

image.png


如下所示,可以看出 Material 内部使用了 PhysicalShape 组件,其颜色恰是 F3F1F7 。这就说明 Material 的颜色并不仅仅是由 color 属性决定的,肯定和其他颜色混合了一下。下面就看一下源码中对颜色的处理逻辑。

image.png

下面是 Material 组件中的源码实现,可以很清晰的看出 useMaterial3 下,AnimatedPhysicalModel 的颜色是由 backgroundColor (Material#color) 和 surfaceTintColor 以及 elevation 共同决定的。 image.png

颜色的换算过程由 ElevationOverlay.applySurfaceTint 处理,通过如下代码不难看出 surfaceTint 设为 null 或透明,就可以避免其对颜色的影响。

dart static Color applySurfaceTint(Color color, Color? surfaceTint, double elevation) { if (surfaceTint != null && surfaceTint != Colors.transparent) { return Color.alphaBlend(surfaceTint.withOpacity(_surfaceTintOpacityForElevation(elevation)), color); } return color; }

image.png

对于任何界面展示效果的问题,都可以通过 Flutter Inspector 来分析、定位问题所在,再查看相关的源码来解决。这就是通过 解决问题 ,进行探索和学习。也许有时候解决方案很简单,但过程中你会学得的更多。比如通过布局分析器查看时,你会发现:弹框是一个在 MaterialApp 下的独立路由,通过 _OverlayEntryWidget 挂在 _Theater 下显示,我们的应用界面也是一个 _OverlayEntryWidget 。这就不再展开了,有机会专门介绍一下。

image.png

这种解决问题流程中积攒的经验,将是非常宝贵的,它可以让你看清问题的根源所在,对整体有更好的把握。那本文就到这了,谢谢观看 ~

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

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

相关文章

10分钟实现任务调度平台搭建

日常项目中,会有很多需要定时执行的任务,而这些任务的变化比较多,可能随时都要调整,那么对调度的灵活性要求比较高。我们传统的Spring Task或者Quartz,可以实现定时任务调度,但是内置在代码里,修…

JA64 1+2+3+...n

一、题目 求123...n_牛客题霸_牛客网 二、代码 1.使用静态成员变量构造函数 class SUM {private:static int _i;static int _ret;public:SUM(){_ret _ret _i;_i;}static int GetRet(){return _ret;} }; int SUM::_i1; int SUM::_ret0;class Solution { public:int Sum_So…

【java的类型数据】——八大类型数据

文章目录 前言字面常量字面常量的分类: 数据类型和变量变量的包装类和范围范围整型变量byteintshortlong 浮点型变量双精度浮点型double单精度浮点型float 字符型变量char布尔型变量 boolean 类型转换自动类型转换(隐式)强制类型转换(显式&am…

一个字符驱动示例 -- 微秒级别周期 反转GPIO

仅作为自我记录的一个demo 本次GPIO以微妙级别频率的反转实验有以下几个启示: 一开始在应用层做延时,来实现2微妙周期,占空比50%的GPIO反转,发现波形的频率一直上不去,只能在25hz徘徊,后来索性去掉延时&am…

flink写入到kafka 大坑解析。

1.kafka能不能发送null消息? 能! 2 flink能不能发送null消息到kafka? 不能! public static void main(String[] args) throws Exception {StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(…

JavaWeb+jsp+Tomcat的叮当书城项目

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88123111?spm1001.2014.3001.5503 技术:ssm jsp JDK1.8 MySQL5.7 Tomcat8.3 源码数据库课程设计 功能:管理员与普通用户和超级管理员三个角色,管理员可…

浅谈 Spring AOP 思想

Spring AOP AOP 切面编程普通代理类JDK动态代理Cglib动态代理AOPAOP术语AOP切面编程的优势Advice通知类型(5种)通知的执行顺序 Order切入点表达式表达式execution注解annotation Spring事务管理Transactional 及 Transactional 的两个属性Transactional …

常用直线模组的类型

目前,直线模组的应用非常广泛,而且直线模组的种类也有很多可以满足每个行业的应用要求,那么常见的直线模组类型有哪些,大家知道吗? 1、全封闭滚珠丝杆直线模组: 在半封闭式的基础上增加了不锈钢带防尘结构…

[Angular] Import TranslateModule in Angular 16

1.Background Angular 更新至V16版后,支援 standalone,故移除了 NgModule,而TranslateModule 又要在AppModule中 import,那该如何做呢? 2.NPM packages installation npm install ngx-translate/core npm install n…

BUUCTF——reverse3 适合新手的关于base64加密算法代码的分析

作为一个逆向小白,学了点加密算法就来BUU找点乐子,前7题蛮简单的,然后做到了reverse3,典型的base64加密算法,让我折腾了好久,写篇博客记录一下 顺便说下很多博客并没有对这里的加密算法进行代码上的分析&a…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景:因公司项目需求改用VMware Workstation Pro,已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今, 1:这里贴出拿出现的问题提示及解决方法的链接:解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

Echarts 文字太长用省略号代替

xAxis: [{type: category,data: [materialUserEchartsDate.value[0] ? materialUserEchartsDate.value[0].name : ,materialUserEchartsDate.value[1] ? materialUserEchartsDate.value[1].name : ,materialUserEchartsDate.value[2] ? materialUserEchartsDate.value[2].na…

二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

要实现这个效果,我们先看一下目前的页面展示: 左边有一个图例,我们可以方法缩小地图,右边是动态的marker标记,到时候肯定时候是后端将对应的颜色标识、文字展示、坐标点给咱们返回、我们肯定可以拿到一个list&#xf…

【广州华锐互动】无人值守变电站AR虚拟测控平台

无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统,它可以利用增强现实技术将虚拟信息叠加在真实场景中,帮助巡检人员更加高效地完成巡检任务。这种系统的出现,不仅提高了巡检效率和准确性,还降低了巡检成本…

企业级敏捷转型探索与实践︱极狐Gitlab战略运营部PMO郝韫

极狐Gitlab战略运营部PMO郝韫先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:企业级敏捷转型探索与实践。大会将于8月12-13日在北京举办,敬请关注! 议题简要: 打造持续创新、快速成长的敏捷组织…

python调用百度ai将图片/pdf识别为表格excel

python调用百度ai将图片识别为表格excel 表格文字识别(异步接口)图片转excel 表格文字识别V2图片/pdf转excel通用 表格文字识别(异步接口) 图片转excel 百度ai官方文档:https://ai.baidu.com/ai-doc/OCR/Ik3h7y238 使用的是表格文字识别(异步接口),同步…

【C#】微软的Roslyn 是个啥?

一、说明 Roslyn 是微软重写的C#编译器并开源。 Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。以下是它如何在过去十年企业Microsoft的最黑暗中开始,并成为所有C#(和VB)的开源,跨平台,公共语言引擎&#xff0c…

springboot+mybatis-plus+vue+element+vant2实现短视频网站,模拟西瓜视频移动端

目录 一、前言 二、管理后台 1.登录 2.登录成功,进入欢迎页 ​编辑 3.视频分类管理 4. 视频标签管理 5.视频管理 6.评论管理 ​编辑 7.用户管理 8.字典管理 (类似于后端的枚举) 9.参数管理(富文本录入) 10.管…

Docker容器监控之 CAdvisor+InfluxDB+Granfana

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,一般小公司够用了。但是,docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能…

VMware搭建Hadoop集群 for Windows(完整详细,实测可用)

目录 一、VMware 虚拟机安装 (1)虚拟机创建及配置 (2)创建工作文件夹 二、克隆虚拟机 三、配置虚拟机的网络 (1)虚拟网络配置 (2)配置虚拟机 主机名 (3&#xf…