Flutter Exception降到万分之几的秘密

1. flutter exception

闲鱼技术团队于2018年上半年率先引入了Flutter技术实现客户端开发,到目前为止成功改造并上线了复杂的商品详情和发布业务。随着flutter比重越来越多,我们开始大力治理flutter的exception,起初很长一段时间内闲鱼内flutter的exception率一直在千分之几左右。经过我们的整理和解决,解决了90%以上的flutter exception。

我们对exception进行了归类,大头主要分为两大类,这两大类堆栈数量很多,占到整体90%左右:

1.第一大类的堆栈都指向了setstate

#0      State.setState (package:flutter/src/widgets/framework.dart:1141)
#1      _DetailCommentWidgetState.replyInput.<anonymous closure>.<anonymous closure> (package:fwn_idlefish/biz/item_detail/fx_detail_comment.dart:479)
#2      FXMtopReq.sendReq.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/mtop_req.dart:32)
#3      NetService.requestWithModel.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/net_service.dart:58)
#4      _rootRunUnary (dart:async/zone.dart:1132)
#5      _CustomZone.runUnary (dart:async/zone.dart:1029)
#6      _FutureListener.handleValue (dart:async/future_impl.dart:129)

2.第二大类堆栈都与buildContext直接或者间接相关

#0      Navigator.of (package:flutter/src/widgets/navigator.dart:1270)
#1      Navigator.pop (package:flutter/src/widgets/navigator.dart:1166)
#2      UploadProgressDialog.hide (package:fwn_idlefish/biz/publish/upload_progress_dialog.dart:35)
#3      PublishSubmitReducer.doPost.<anonymous closure> (package:fwn_idlefish/biz/publish/reducers/publish_submit_reducer.dart:418)
<asynchronous suspension>
#4      FXMtopReq.sendReq.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/mtop_req.dart:32)
#5      NetService.requestWithModel.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/net_service.dart:58)
#6      _rootRunUnary (dart:async/zone.dart:1132)
#7      _CustomZone.runUnary (dart:async/zone.dart:1029)

第一类明显与element和sate的生命周期有关。第二类与buildContext有关。

buildContext是什么?

下面是一段state中获取buildContext的实现

Element get _currentElement => _registry[this];
BuildContext get currentContext => _currentElement;

很明显buildContext其实就是element实例。buildContext是一个接口,element是buildContext的具体实现。

所以上面的exception都指向了flutter element和state的生命周期

2.flutter 生命周期

1.state生命周期


2. element 与state生命周期

element是由widget createElement所创建。state的生命周期状态由element调用触发。


最核心的是在new elment的时候element的state的双向绑定正式建立。在umount的时候element和state的双向绑定断开。

3. activity生命周期与state关系

flutter提供WidgetsBindingObserver给开发者来监听AppLifecycleState。
AppLifecycleState有4中状态


1.resumed
界面可见,比如应用从后台到前台2.inactive
页面退到后台或者弹出dialog等情况下
这种状态下接收不到很任何用户输入,但是还会有drawframe的回调3.paused
应用挂起,比如退到后台。进入这种状态代表不在有任何drawframe的回调4.suspending
ios中没用,puased之后进入的状态,进入这种状态代表不在有任何drawframe的回调

看下android生命周期和appLifecycleState、state关系

  1. 创建

2.按home键退到后台

3.从后台回到前台

4.back键退出当前页面(route pop)

5.back键退出应用

3.常见的exception例子

1.在工程开发中,我们最容易忽略了state的dispose状态。

看一段例子:

这个例子可能会在某些情况下excetion。
在state dispose后,element会和state断开相互引用,如果在这个时候开发者去拿element的位置信息或者调用setstate 刷新布局时就会报异常。

最常见的是在一些timer、animate、网络请求等异步逻辑后调用setstate导致的excetion。安全的做法是在调用setstate前判断一下state是否是mounted状态。如下:

2.buildcontext使用错误

看一段错误使用buildcontext例子

上面的错误在于在跨堆栈使用了buildcontext。由于outcontext的生命周期与buttomcontext不一致,在弹出bottomsheet的时候outcontext可以已经处于umount或者deactivite。上面例子正确的做法是使用bottomcontext获取focusScopeNode。

我们在跨堆栈传递参数(如bottomsheet、dialog、alert、processdialog等)场景时特别要注意buildcontext的使用。

最后

不过瘾?如果你还想了解更多关于flutter开发更多有趣的实战经验,就来关注微信公众号 "闲鱼技术"。

 


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

mac vim php 颜色,mac vim 配色

syntax onset nuset noicset t_Co256set tabstop4set nocompatibleset shiftwidth4set softtabstop4set backspace2set autoindentset expandtabset smartindentset hlsearch"状态栏显示当前执行的命令set showcmd"粘贴时保持格式set paste"允许使用鼠标点击定位…

云栖专辑 | 阿里开发者们的第6个感悟:享受折磨

2015年12月20日&#xff0c;云栖社区上线。2018年12月20日&#xff0c;云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来&#xff0c;寒冬中&#xff0c;最值得投资的是学习&#xff0c;是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

事务专栏

事务用法&#xff1a; 写一个配置类 EnableTransactionManagement Configuration public class TransactionManagementConfig {}在需要事物的方法上添加 Transactional注解即可&#xff0c; 特殊场景&#xff1a;注解也加了为什么还是不生效&#xff0c; 建议&#xff0c; 1&g…

推荐算法 php SQL,MixPHP 独特的SQL构建方式

独特的SQL构建方式MixPHP 对CUD这些写操作都有专用方法&#xff0c;可快速构建&#xff0c;使用方法也与 Yii2 完全一至&#xff0c;而R操作完全不一样&#xff0c;MixPHP 发明了一种新奇的构造方式&#xff0c;非常简单的方式&#xff0c;在定义复杂查询时&#xff0c;可使 SQ…

2019年人工智能硬件与应用大趋势

2019年即将到来&#xff0c;人工智能将往什么方向发展&#xff1f;机器学习将如何演变为人工智能&#xff1f;在神经网络领域具有20年的技术经验Eugenio Culerciello&#xff0c;在硬件和软件两方面都有经验积累。他预测&#xff0c;在硬件和应用两方面&#xff0c;2019年的人工…

阿里专家杜万:Java响应式编程,一文全面解读

本篇文章来自于2018年12月22日举办的《阿里云栖开发者沙龙—Java技术专场》&#xff0c;杜万专家是该专场第四位演讲的嘉宾&#xff0c;本篇文章是根据杜万专家在《阿里云栖开发者沙龙—Java技术专场》的演讲视频以及PPT整理而成。 摘要&#xff1a;响应式宣言如何解读&#xf…

redis集群原理分析--故障转移

https://blog.csdn.net/hw120219/article/details/95939870

java中的v递归的思想,Java中的递归思想 - osc_9lqilnv7的个人空间 - OSCHINA - 中文开源技术交流社区...

递归&#xff1a;递归的概念&#xff1a;方法自身调用自身则称为递归。递归的分类&#xff1a;间接递归&#xff1a;方法A调用方法B&#xff0c;方法B调用方法C&#xff0c;方法C调用方法A。直接递归: 方法A调用方法A。(常用)递归的注意事项&#xff1a;递归一定要出口&#xf…

日站会——你的站会姿势正确吗?

今天我们讲讲如何利用站会&#xff0c;更好地实现促进团队有效协作和聚焦&#xff0c;促进价值顺畅流动和交付&#xff0c;同时及时的暴露问题和风险。 站会的目标 说到站会&#xff0c;人们最熟悉的Scrum站会&#xff0c;典型的形式是团队围成一圈&#xff0c;依次回答三个问…

springboot2 配置redis报错 redis timeout Value not a valid duration解决办法

配置文件加上时间单位ms就好了&#xff0c; application.yml spring:redis:# Redis数据库索引&#xff08;默认为0&#xff09;database: 10# Redis服务器地址host: 192.168.203.220# Redis服务器连接端口port: 6379# Redis服务器连接密码&#xff08;默认为空&#xff09;pas…

TableStore实战:DLA+SQL实时分析TableStore

一、实战背景 什么是DLA&#xff08;DataLake Analytics数据湖&#xff09;&#xff1f;他是无服务器化&#xff08;Serverless&#xff09;的云上交互式查询分析服务。作为分布式交互式分析服务&#xff0c;是表格存储计算生态的重要组成之一。为了使用户更好的了解DLA的功能…

matlab里用fix函数,Matlab基本函数-fix函数

1、fix函数&#xff1a;向零方向取整2、用法说明&#xff1a;yfix(x) 函数将x中元素零方向取整&#xff0c;得到y是一个整数数组。对于复数z&#xff0c;分别对实部和虚部取整3、举例说明>> x [1-2.9i 34.5i 5-6.7i 9-10.2i]x 1.0000 - 2.9000i 3.0000 4.5000i 5.0000 …

权限管理快速入门_01

文章目录一、表结构设计二、权限方法2.1. 根据用户id,查询用户拥有的角色列表2.2. 根据角色id,查询用户拥有的权限列表2.3. 获取用户拥有权限的菜单列表彩蛋&#xff1a; 组装数据成树工具类补充表结构一、表结构设计 一般权限管理由5张表构成(3张主表2张中间表)&#xff1a;包…

云栖专辑 | 阿里开发者们的第8个感悟:在信息大爆炸的时代,保持专注度显得尤为可贵

2015年12月20日&#xff0c;云栖社区上线。2018年12月20日&#xff0c;云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来&#xff0c;寒冬中&#xff0c;最值得投资的是学习&#xff0c;是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

php脚本防上多进程同时执行,Jorker

软件简介Jorker — 脚本多进程执行功能脚本多进程执行支持中断续运行内存过载保护定时报告进度高度可配置安装composer require jorker/jorker用法require_once(dirname(__DIR__) . /vendor/autoload.php);$manager new \Jorker\JobForkerManager(3);$manager->allot(funct…

手机秒变IoT设备?——巧妙利用阿里云物联网平台

什么&#xff1f;嵌入五行代码可以实现用户定位&#xff0c;用户在线数量统计&#xff0c;还能和云端消息交互&#xff01; 没错得益于阿里云物联网套件创建设备免费&#xff0c;消息收费也只有百万消息三块六&#xff08;先使用后付费&#xff0c;不满不要钱&#xff09;&…

springboot3.x 集成持久层框架

文章目录一、通用部分1. 通用依赖2. 通用配置 yml二、 springboot3.x 集成通用mapper2.1. pom.xml2.2. yml2.3. mapper接口2.4. 启动类加MapperScan注解2.5. 启动类加ComponentScan注解三、 springboot3.x 集成通用Mybatis3.1. pom.xml3.2. yml3.3. mapper接口3.4. 启动类加Map…

阿里CEO逍遥子:学会“用人做事”,而不是“做事用人”

你们知道的&#xff0c;双11之后&#xff0c;我们做了一件晴天修屋顶的事儿&#xff0c;就是进行组织架构的调整——阿里云升级为阿里云智能&#xff1b;天猫升级为“大天猫”&#xff0c;形成天猫事业群、天猫超市事业群、天猫进出口事业部三大板块&#xff1b;加强技术、智能…

51php 数据不同步,php避免循环查询数据库优化一对多查询

列表查询中一对多查询循环查询优化&#xff0c;mysql循环查询优化描述比如查询学生列表&#xff0c;每一行需要包含该学生的家长列表&#xff0c;一个学生对应多个家长。循环查询方式先查出学生列表&#xff0c;再循环查询对应的家长列表&#xff0c;需要查询N1次但在循环中查询…

Spring Cloud Alibaba发布第二个版本,Spring 发来贺电

还是熟悉的面孔&#xff0c;还是熟悉的味道&#xff0c;不同的是&#xff0c;这次的配方升级了。 今年10月底&#xff0c;Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布&#xff1a;阿里巴巴开源 Spring Cloud Alibaba&#xff0c;并发布了首个预览版本。随后…