背景
APP内有一个公共组件,使用GetX管理状态。近日线上收到一个异常问题,本地一开始没复现,反复操作一番,发现特殊操作路径给复现了。
异常分析
异常日志
分析堆栈信息,定位到如下代码
异常复现
在页面加载数据的等待过程中,用户点击头部的搜索框,进入了新页面。此时上一页的数据加载成功了,并完成了页面渲染,退出新页面,返回上一页。上一页内有一个公共组件,公共组件有自己的logic。操作这个广告组件时,异常发生了,这个公共组件logic找不到了。
-
数据加载中
-
数据加载成功
-
分析日志 发现在退出新页面,返回到当前页时,组件的logic被释放了。而且只有按照上述操作路径才会出现。
- 为啥退出上一页,会一起释放当前页组件的logic呢?追查下去,找到了GetX实例和路由是如何关联的逻辑
公共组件logic实例创建时与路由栈顶页面关联的,所以栈顶页面退出时,所有与之关联的实例都被移除了。
解决方法
总结
GetX的put方法会将组件logic与路由栈顶页关联,而不是实例所在的页面。GetX因为不再需要Context而深受欢迎,也带来了很多坑。