getx的controller是怎么销毁的

getx可以做到通过页面的退出自动控制controller的销毁,那么他是怎么做到的呢

当我们使用getx的路由套件时,可以看到,他的每个跳转方法都使用了自定义的GetPageRoute
GetPageRoute中对于此次的问题,我们需要关注的是两个方法

buildPage

嗯,这里给传了一个reference给了Get.reference,这个reference看一下是什么玩意。。

reference

哦哦,简单来说就是页面的标识。
嗯,接下来是中间件的runner、binding,嗯,pageToBuild了解了。
那么看看另一个方法

dispose

dispose,route退出流程里调用的方法。在这里面Get做了两件事,我们主要关注第一件事,removeDependencyByRoute()参数是上面的页面标识。

removeDependencyByRoute

这个方法里,我们可以看到调用了GetInstancedelete方法,这个方法就是销毁controller的方法,但是为什么呢?为啥传一个页面标识就能删除到对应的controller呢。我们接着看

我们都知道我们在使用getx的controller时,一定会有两个操作,一个是Get.put(),一个是Get.find()让我们一个一个的看一下

Get.put()

GetInstance().put()

_insert()

Get.put的本质其实是将我们传入的实例,根据类Stag创建一个key,然后以key和实例作为键值对存入了全局的map中(此处是简单理解,看也看得出来不是直接传实例了)

Get.find()

GetInstance().find()

Get.find方法很简单的只是通过类Stag去全局map中找一个实例返回出去,但是返回之前,还做了一步操作,即_initDependencies

_initDependencies

_initDependencies

看到没,就在下面Get.reference,之前在GetPageRoute的页面构建之前赋值了最近的页面,然后在此处用来做routesKey的value和前面的controller的key值进行绑定。

这也是得益于flutter是个单线程模型,才能这样无脑的通过这种方式传值。其实getx中有不少让人觉得神奇的地方都是利用了单线程的优势,比如Obx的自动刷新,也是在Obx的build方法和Rx的value的get方法之间通过一个全局指针来进行传值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在开发生产级应用程序时,采用最佳软件工程实践来实现健壮性和稳定性是很重要的。这种做法之一就是依赖注入。依赖注入是将...
    渣渣曦阅读 3,892评论 0 2
  • GetX第三篇-依赖注入 为什么要使用依赖注入 依赖注入是什么 本来接受各种参数来构造一个对象,现在只接受一个参数...
    A_si阅读 13,327评论 11 30
  • 在使用了 Provider 一年后,遇到了很多阻力,期间尝试过 BLoC 、MobX ,均不如意,一个样本代码太多...
    A_si阅读 4,957评论 10 41
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,281评论 2 7