getx可以做到通过页面的退出自动控制controller的销毁,那么他是怎么做到的呢
当我们使用getx的路由套件时,可以看到,他的每个跳转方法都使用了自定义的GetPageRoute
。
在GetPageRoute
中对于此次的问题,我们需要关注的是两个方法
嗯,这里给传了一个reference
给了Get.reference
,这个reference
看一下是什么玩意。。
哦哦,简单来说就是页面的标识。
嗯,接下来是中间件的runner、binding,嗯,pageToBuild了解了。
那么看看另一个方法 dispose
dispose
,route退出流程里调用的方法。在这里面Get做了两件事,我们主要关注第一件事,removeDependencyByRoute()
参数是上面的页面标识。
这个方法里,我们可以看到调用了GetInstance
的delete
方法,这个方法就是销毁controller的方法,但是为什么呢?为啥传一个页面标识就能删除到对应的controller呢。我们接着看
我们都知道我们在使用getx的controller时,一定会有两个操作,一个是Get.put()
,一个是Get.find()
让我们一个一个的看一下
Get.put()
GetInstance().put()_insert()
Get.put
的本质其实是将我们传入的实例,根据类S
和tag
创建一个key
,然后以key和实例作为键值对存入了全局的map中(此处是简单理解,看也看得出来不是直接传实例了)
Get.find()
GetInstance().find()Get.find
方法很简单的只是通过类S
和tag
去全局map中找一个实例返回出去,但是返回之前,还做了一步操作,即_initDependencies
。
_initDependencies
_initDependencies看到没,就在下面Get.reference,之前在GetPageRoute的页面构建之前赋值了最近的页面,然后在此处用来做routesKey的value和前面的controller的key值进行绑定。
这也是得益于flutter是个单线程模型,才能这样无脑的通过这种方式传值。其实getx中有不少让人觉得神奇的地方都是利用了单线程的优势,比如Obx的自动刷新,也是在Obx的build方法和Rx的value的get方法之间通过一个全局指针来进行传值。
网友评论