案發(fā)現(xiàn)場:
在main.dart的runApp函數(shù)入口通過AppControllerBinding中的Get.lazyPut懶加載綁定了一個全局的controller夹抗,在A界面通過Get.find()彬檀,可以拿到這個controller,我退出A界面(還沒退出APP)controller就回調(diào)了onClose函數(shù)薄啥,我再次進入商品列表界面撩扒,提示我: "AppController" not found. You need to call "Get.put(AppController())" or "Get.lazyPut(()=>AppController())"
這個時候我很奇怪似扔,既然是通過runApp入口綁定的全局的Controller,為什么在A界面第一次使用的時候可以獲取到搓谆,退出來就銷毀了炒辉,在進入A界面就直接報錯了呢?
這就要來細讀一下Getx中put和lazyPut這兩個函數(shù)以及他們的參數(shù)泉手。
Get.put
Get.put<AppController>(AppController(),permanent: false);
核心是第二個參數(shù)permanent黔寇,默認是false
- 當為false的時候,當在A視圖中put斩萌,退出A視圖就會銷毀缝裤,當在B視圖在使用的時候,就會報錯"AppController" not found. You need to call "Get.put(AppController())" or "Get.lazyPut(()=>AppController())"
- 當為true的時候颊郎,一旦put之后憋飞,就不會銷毀,其他視圖也可以繼續(xù)使用
Get.lazyPut
Get.lazyPut<AppController>(() => AppController(),fenix: true);
到了lazyPut函數(shù)又不一樣了姆吭,因為參數(shù)變成fenix了榛做,并不是上面的permanent,而fenix的意思也有很大的區(qū)別内狸。我們?nèi)菀字纋azyPut是懶加載的检眯,在那個視圖需要的時候,就在哪個視圖初始化昆淡,而fenix這個參數(shù)就比較重要锰瘸。
fenix為false的時候:
第一次進入視圖的時候初始化,退出視圖的時候昂灵,銷毀避凝,再次進入該視圖會報錯 "AppController" not found. You need to call "Get.put(AppController())" or "Get.lazyPut(()=>AppController())"
fenix為true的時候:
第一次進入視圖的時候初始化,退出視圖的時候倔既,銷毀恕曲,再次進入該視圖重新初始化。
這就是案發(fā)現(xiàn)場的原因2秤俊E逡ァ!J蹬睢茸俭!