getx可以做到通過頁面的退出自動控制controller的銷毀,那么他是怎么做到的呢
當(dāng)我們使用getx的路由套件時,可以看到,他的每個跳轉(zhuǎn)方法都使用了自定義的GetPageRoute。
在GetPageRoute中對于此次的問題,我們需要關(guān)注的是兩個方法

嗯,這里給傳了一個reference給了Get.reference,這個reference看一下是什么玩意。。

哦哦,簡單來說就是頁面的標(biāo)識。
嗯,接下來是中間件的runner、binding,嗯,pageToBuild了解了。
那么看看另一個方法

dispose,route退出流程里調(diào)用的方法。在這里面Get做了兩件事,我們主要關(guān)注第一件事,removeDependencyByRoute()參數(shù)是上面的頁面標(biāo)識。

這個方法里,我們可以看到調(diào)用了GetInstance的delete方法,這個方法就是銷毀controller的方法,但是為什么呢?為啥傳一個頁面標(biāo)識就能刪除到對應(yīng)的controller呢。我們接著看
我們都知道我們在使用getx的controller時,一定會有兩個操作,一個是Get.put(),一個是Get.find()讓我們一個一個的看一下
Get.put()


Get.put的本質(zhì)其實是將我們傳入的實例,根據(jù)類S和tag創(chuàng)建一個key,然后以key和實例作為鍵值對存入了全局的map中(此處是簡單理解,看也看得出來不是直接傳實例了)
Get.find()

Get.find方法很簡單的只是通過類S和tag去全局map中找一個實例返回出去,但是返回之前,還做了一步操作,即_initDependencies。
_initDependencies

看到?jīng)],就在下面Get.reference,之前在GetPageRoute的頁面構(gòu)建之前賦值了最近的頁面,然后在此處用來做routesKey的value和前面的controller的key值進行綁定。
這也是得益于flutter是個單線程模型,才能這樣無腦的通過這種方式傳值。其實getx中有不少讓人覺得神奇的地方都是利用了單線程的優(yōu)勢,比如Obx的自動刷新,也是在Obx的build方法和Rx的value的get方法之間通過一個全局指針來進行傳值。