GetX:组件logic意外释放问题

329 阅读1分钟
背景

APP内有一个公共组件,使用GetX管理状态。近日线上收到一个异常问题,本地一开始没复现,反复操作一番,发现特殊操作路径给复现了。

异常分析

异常日志 Screenshot 2024-08-25 at 16.54.40.png

分析堆栈信息,定位到如下代码 Screenshot 2024-08-25 at 17.02.55.png

异常复现

在页面加载数据的等待过程中,用户点击头部的搜索框,进入了新页面。此时上一页的数据加载成功了,并完成了页面渲染,退出新页面,返回上一页。上一页内有一个公共组件,公共组件有自己的logic。操作这个广告组件时,异常发生了,这个公共组件logic找不到了。

  • 数据加载中 Screenshot 2024-08-25 at 17.17.39.png

  • 数据加载成功 Screenshot 2024-08-25 at 17.17.22-1.png

  • 分析日志 发现在退出新页面,返回到当前页时,组件的logic被释放了。而且只有按照上述操作路径才会出现。

Screenshot 2024-08-25 at 17.41.04-1.png

  • 为啥退出上一页,会一起释放当前页组件的logic呢?追查下去,找到了GetX实例和路由是如何关联的逻辑

公共组件logic实例创建时与路由栈顶页面关联的,所以栈顶页面退出时,所有与之关联的实例都被移除了。 Screenshot 2024-08-25 at 17.51.28.png

Screenshot 2024-08-25 at 17.52.01.png

解决方法

Screenshot 2024-08-25 at 17.57.15.png

总结

GetX的put方法会将组件logic与路由栈顶页关联,而不是实例所在的页面。GetX因为不再需要Context而深受欢迎,也带来了很多坑。