您现在的位置是:首页» windows系统» flutter异常解决,flutter缺陷

flutter异常解决,flutter缺陷

2024-07-13 15:30:52
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。前言在前面的文章中,“百瓶降水实践中的参议员”,笔者主要从方案选型 & 落地实践两个大的方面进行了阐述,本篇文章我们主要对

本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。

前言

在前面的文章中,“百瓶降水实践中的参议员”,笔者主要从方案选型 & 落地实践两个大的方面进行了阐述,本篇文章我们主要对 Sentry 在百瓶的落地实践中遇到的问题进行分析。本文分析的主要问题主要包括以下主要类别(Flutter SDK 1.22.6 、Dart SDK 2.10.5版本:

NoSuchMethodError Flutter 官方 bug (已经修复) StateError NetworkError(DNS)

NoSuchMethodError

问题一

问题描述:

在进行 List 、String 等类型数据判空处理时,直接使用 xx.isNotEmpty,不判断它是否无效,导致 NoSuchMethodError:The getter isNotEmpty was called null。

问题截图:

<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/860fb4fd0f3148049d2e438d383308a8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/037d0dac18234bd3b73de40a9fdf0fc2~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />

解决方案:

在进行判空处理时,必须首先判断是否无效,那么使用 isNotEmpty来判断,避免这种类型错误,考虑到我们在项目中将使用大量类似的判断,因此,我们可以将相同的数据判断方法包起来,避免重复每次使用.

问题二

问题描述:

这里是使用了 Future.wait 并发请求多个 API,并且在第二个 API 设置超时,由于第二个 API 请求超时,在后续处理响应时,没有处理空异常判断导致获取不到 code。

问题截图:

<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a5f359fcd57a4152986e8a853b7500fc~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f85d7d219b99495980cafd89bac3301d~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />

解决方案:

在使用了 Future.wait 并发请求多个 API ,如果有设置超时处理,要考虑到 API 请求超时失败的问题尽量避免这种问题发生。

问题三

问题描述:

当我们需要与 Widget 上下文关联的 RenderBox 大小或位置时会发生错误。

问题截图:

<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/adff6e8c6cd64df283d1bad7be586213~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8798fc5027414ce8b7f2c936b97f9047~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />

解决方案:

发生以上问题的原因是,上下文并没有与我们的 state 进行关联,如果要避免这种情况发生,我们可以在 Widget 渲染完毕后再进行获取 RenderBox 尺寸或者位置。

Flutter 官方 bug (已经修复)

问题描述:

当使用 NestedScrollView组件时,由于 position.minScrollExtent 可以为空 ,在生产环境中运行会偶现 NoSuchMethodError nested_scroll_view.dart in _NestedScrollCoordinator.hasScrolledBody NoSuchMethodError: The method ‘>’ was called on null. Receiver: null Tried calling: >() 这个问题,目前官方已经解决并且合并到 master 分支。

问题截图:

那么这个问题是怎么发生的? 官方的解释是:

1.scheduleAttachRootWidget 将调用 _firstBuild 并新建一个具有空像素的 _NestedScrollPosition;2.FocusManager将安排一个小任务;3.完成 firstBuild 然后刷新 microTask,NestedScrollView 又 dirty 了;4.scheduleWarmUpFrame重建脏节点并触发异常(_NestedScrollPosition仅在布局之后才能使用)。

解决方案:

StateError

问题描述:

当我们在使用 list.firstWhere 的时候,通常会引发 Bad State: No element 这类问题。

问题截图:

<img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b5e5d26b75e4cd49a747909291b74ab~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image) <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2f7dc543f513434eba6ad762d27298b8~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image” style=“margin: auto” /” style=“margin: auto” />

解决方案:

在我们使用 list.firstWhere 的时候,通常有匹配不到条件的时候,这个时候就非常有必要使用 orElse 来进行处理这种情况。

下面的代码根据条件筛选为 ‘green’ 的结果值,如果没有的话就返回 ‘No matching color found’,结果输出为:No matching color found。

如果没有写 orElse 的情况下会抛出异常: Unhandled exception: Bad state: No element。当然,如果在 Null安全版本中,第一个WhereOrNull方法可以直接使用。 下面我们来对比一下 firstWhere 和 firstWhereOrNull 的源码:

firstWhere 会首先进行匹配符合条件的结果,如果没有匹配到,然后再进行处理或别的,没有或别的,就会抛出异常;firstWhereOrNull 就简单的多了,如果值不匹配条件,直接返回零。

NetworkError(DNS)

网络错误是一个导致网络请求失败的错误条件。每个网络错误都有类型,是一个字符串,每个网络错误都有阶段,并且它描述了该错误发生阶段:

1.dns:在DNS分析过程中出现的错误;2.连接:在建立安全连接时发生错误;3.应用:请求和响应传输过程中出现的错误;

问题描述:

当客户端向服务发起网络请求时,他们都通过DNS分析过程,一般来说,基于DNS协议向本地DNS操作员发起分析请求是传统的方法,但在这种情况下,域名的黑客和跨网络访问可能发生,造成域名解析异常。

解决方案:

那么,如果我们的应用程序启动网络请求,DNS分析失败,我们应该怎么办?当然我们可以接入阿里云云解析 DNS 服务或者腾讯移动解析 HTTP DNS 等服务来更加有效的保障 App、小程序正常访问。

让我们看看以下的DNS相关知识:

什么是 DNS 域名分层结构 DNS 分层结构 DNS 解析过程

DNS

DNS 是域名系统 (Domain Name System) 的缩写,是互联网的核心服务,这是一个分布式数据库,它映射域名称和IP地址。使人们更容易上网,不需要记住机器读取的IP字符串。

域名分层结构

由于大量互联网用户,所有互联网在命名时使用层次式树状命名方法。与互联网连接的任何主机或路由器,这里有一个单一的层次结构(域名)。域名可以分成子域名,分区也可以继续分为分区,这构成了顶层域名、主域名、子域名等。

1.“com”是顶级域名;2."Baiping."com"是主域名(也称为信托级别域名),主要指公司网页名称;3."Example.Baiping."com"是一个子域名(也称为二级信任域名); 4.“ www.example.baiping.com ” 是子域名的子域(也可称为托管三级域名)。

DNS 分层结构

域名是分层结构,域名DNS服务器也是相应的层结构.有了域名结构,还有一个域名DNS服务器来分析域名,并且需要由全球域名DNS服务器进行分析,域名DNS服务器实际上是域名系统的主机。

DNS 解析过程

DNS查询的结果通常在本地域名服务器中缓存,如果本地域名服务器有缓存,以下的DNS查询步骤将被遵循,很快返回解析结果。如果在本地域名服务器上没有缓存,DNS查询所需的8个步骤是:

1.用户在 Web 浏览器中输入 “example.com”,则由本地域名服务器开始进行递归查询。2.本地域名服务器使用迭代查询方法来查询根域名服务器;3.根域名服务器告诉本地域名服务器,下一步应该查询的顶级域名服务器 .com TLD(顶级域名服务器)的 IP 地址;4.本地域名服务器向上级域名服务器.comTLD查询;5…com TLD 服务器告诉本地域名服务器,下一步查询 example.com 权威域名服务器的 IP 地址;6.向 example.com授权的域名服务器发送查询;7.example.com权限域服务器告诉本地域服务器查询的主机IP地址;8.本地域名服务器最后把查询的IP地址响应给 Web 浏览器。一旦 DNS 查询的 8 个步骤返回了 example.com 的 IP 地址,浏览器就能够发出对网页的请求;9.浏览器向IP地址发送HTTP请求;10.这个IP的Web服务器返回在浏览器中显示的网页。

名词解释:

1.DNS Resolve:指本地域名服务器,这是DNS搜索中的第一个网站,负责处理初始请求的DNS服务器。运营商 ISP 分配的 DNS、谷歌 8.8.8.8 等都属于 DNS Resolver;2.Root Server:指根域名服务器,当本地域名服务器在本地查询不到解析结果时,则第一步会向它进行查询,并获取顶级域名服务器的 IP 地址;3.递归查询:是指 DNS 服务器在收到用户发起的请求时,必须向用户返回一个准确的查询结果。如果 DNS 服务器本地没有存储与之对应的信息,则该服务器需要询问其他服务器,并将返回的查询结构提交给用户;4.迭代查询:是指 DNS 服务器在收到用户发起的请求时,并不直接回复查询结果,而是告诉另一台 DNS 服务器的地址,用户再向这台 DNS 服务器提交请求,这样依次反复,直到返回查询结果。

总结

上述四种例外经常在编码开始时出现,通过分析上述四种例外,我们可以从经验中得出一些结论,并在后续开发中,我们可以根据这些结论改进,以便更好地解决这个问题。

XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com

标签: 分析 Flutter