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个弥足珍贵的…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

阿里研究员谷朴:API 设计最佳实践的思考

API是软件系统的核心&#xff0c;而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素。但复杂度Complexity并非某一个单独的问题能完全败坏的&#xff0c;而是在系统设计尤其是API设计层面很多很多小的设计考量一点点叠加起来的&#xff08;也即John Ousterhou…

2018年深度学习的主要进步

在过去几年中&#xff0c;深度学习改变了整个人工智能的发展。深度学习技术已经开始在医疗保健&#xff0c;金融&#xff0c;人力资源&#xff0c;零售&#xff0c;地震检测和自动驾驶汽车等领域的应用程序中出现。至于现有的成果表现也一直在稳步提高。 在学术层面&#xff0…

大横琴科技联合阿里云发布全国首个跨境服务创新平台琴澳通

12月3日&#xff0c;阿里云广东峰会期间&#xff0c;大横琴科技公司联合阿里云发布了全国首个跨境服务创新平台。基于该平台&#xff0c;全国首个跨境服务APP“琴澳通”也正式发布。“琴澳通”将为澳门企业及个人提供服务&#xff0c;推动澳门和广东两地的产业经济联动&#xf…

各类监督方法流行趋势分析

又到一年的年末了&#xff0c;到了进行总结并展望来年的时候了&#xff0c;在这里预祝各位新的一年顺利。闲话少叙&#xff0c;本文将对有监督学习方法进行总结。 机器学习领域在过去几十年中经历了巨大的变化&#xff0c;不可否认的是&#xff0c;虽然有些方法已经存在了很长…

2018年度机器学习50大热门网文

新的一年新气象&#xff0c;总结过去一年&#xff0c;展望新的一年。站在巨人的肩膀上前行&#xff0c;肯定会事半功倍。因此&#xff0c;本文从2018年1月至12月期间挑选出近22,000篇机器学习文章&#xff0c;并进行比较&#xff0c;以挑选出能够提升2019年数据科学技能的前50名…

广东制造按下加速键  千家中小企业上阿里云工业互联网

阿里云广东峰会上&#xff0c;阿里巴巴副总裁、阿里云智能IoT事业部总经理库伟表示&#xff0c;过去2年阿里云与合作伙伴一起助力数千家广东中小企业的数字化转型综合成本降低了70%。 都说中国制造看广东&#xff0c;云计算、物联网、人工智能已成为广东制造发展新引擎。“我们…

阿里云图数据库GraphDB上线,助力图数据处理

GraphDB简介 GraphDB图数据库适用于存储&#xff0c;管理&#xff0c;查询复杂并且高度连接的数据&#xff0c;图库的结构特别适合发现大数据集下数据之间的共性和特性&#xff0c;特别善于释放蕴含在数据关系之间的巨大价值。GraphDB引擎本身并不额外收费&#xff0c;仅收取云…

pom 导入mysql连接,maven项目中的jdbc连接步骤

在maven项目pom.xml中到入驱动包(以下是驱动包代码)mysqlmysql-connector-java8.0.15导入成功会看到Maven Dependencies下有个mysql-connector-Java包然后按下面步骤&#xff1a;package com.base.day16;import java.sql.Connection;import java.sql.DriverManager;import java…