Navigation學習筆記之二--fragment保存狀態(tài)

fragment狀態(tài)保存問題

在使用jetpack的navigation組件過程中遇到的一個問題就是它內(nèi)部使用replace方式切換的fragment胚股,這樣會導致fragment生命周期重走土榴。這樣就不會保留之前的頁面狀態(tài)了,這就有點不友好了恶守。查了一下大家使用的解決方案甘畅,主要有兩種

  • 使用hide/show方式取代replace方式

  • 繼續(xù)使用replace方式,想辦法保存頁面狀態(tài)

經(jīng)過對比這兩種方案發(fā)現(xiàn)感混,navigation原生方式更合理竹伸。因為hide/show方案對內(nèi)存不友好的弊端很難消除泥栖,且項目越大,問題越明顯勋篓。

使用原生方式聊倔,就面臨了另一個問題,如何保存頁面狀態(tài)生巡?Navigation設(shè)計初衷就是UI與數(shù)據(jù)分離耙蔑,所以這個問題,拆解成兩個問題分別解決:

1.頁面問題

Google官方有推薦方案孤荣,就是保存view甸陌。

abstract class BaseFragment : Fragment() {  
    private var rootView : View ?= null  

    override fun onCreateView(  
        inflater: LayoutInflater,  
        container: ViewGroup?,  
        savedInstanceState: Bundle?  
    ): View? {  
        if (rootView == null){  
             rootView = inflater.inflate(getLayoutId(), null)  
        }  
        return rootView  
    }  
    abstract fun getLayoutId():Int  
}

2.數(shù)據(jù)問題

通過viewmodel保存數(shù)據(jù),這里引出兩個問題

  • 1.viewmodel的生命周期跟隨誰

跟隨fragment盐股,那么fragment銷毀的時候钱豁,viewmodel就沒有了。跟隨activity疯汁,那么activcity不銷毀的情況下牲尺,viewmodel就一直存在

看源碼發(fā)現(xiàn),Navigation切換fragment用的是childFragmentManager幌蚊,所有的fragment的父fragment都是NavHostFragment谤碳,于是跟隨requireParentFragment()就可以了

override fun initVM(): StickerViewModel = ViewModelProvider(requireParentFragment())[StickerViewModel::class.java]
  • 2.fragment重新創(chuàng)建的時,重新注冊uiStatus的observer溢豆,注冊的時候蜒简,livedata會把上次數(shù)據(jù)重新發(fā)送一遍。

解決方法也很簡單漩仙,只需要在基類的fragment中清除一下狀態(tài)就好了

還有一個問題搓茬,如果跳轉(zhuǎn)fragment的時候,攜帶了參數(shù)队他,重新回到這個fragment的時候也會重新獲取到。這個也是需要清除的

綜合以上各種問題的解決方案麸折,BaseFragment應(yīng)當如下

abstract class BaseVMFragment<VM : BaseViewModel> : Fragment() {  

    protected var mContentView: View? = null  
    protected lateinit var mViewModel: VM  
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {  
        if (mContentView == null) {  
            mContentView = inflater.inflate(getLayoutResId(), container, false)  
        }  
        return mContentView  
    }  

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {  
        mViewModel = initVM()  
        if (isNeedClearState()) {  
            mViewModel.clearUIState()  
        }  
        initView()  
        initData()  
        startObserve()  
        super.onViewCreated(view, savedInstanceState)  
    }  

    override fun onDestroyView() {  
        //需要清除參數(shù)和uiState  
        arguments?.clear()  
        super.onDestroyView()  
    }  

    open fun isNeedClearState(): Boolean {  
        return true  
    }  

    abstract fun getLayoutResId(): Int  
    abstract fun initVM(): VM  
    abstract fun initView()  

    abstract fun initData()  

    abstract fun startObserve()  

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锡凝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子磕谅,更是在濱河造成了極大的恐慌私爷,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膊夹,死亡現(xiàn)場離奇詭異衬浑,居然都是意外死亡,警方通過查閱死者的電腦和手機放刨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門工秩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人进统,你說我怎么就攤上這事助币。” “怎么了螟碎?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵眉菱,是天一觀的道長。 經(jīng)常有香客問我掉分,道長俭缓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任酥郭,我火速辦了婚禮华坦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘不从。我一直安慰自己惜姐,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布椿息。 她就那樣靜靜地躺著歹袁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寝优。 梳的紋絲不亂的頭發(fā)上宇攻,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音倡勇,去河邊找鬼逞刷。 笑死,一個胖子當著我的面吹牛妻熊,可吹牛的內(nèi)容都是我干的夸浅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼扔役,長吁一口氣:“原來是場噩夢啊……” “哼帆喇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亿胸,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坯钦,失蹤者是張志新(化名)和其女友劉穎预皇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婉刀,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡吟温,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了突颊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁豪。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖律秃,靈堂內(nèi)的尸體忽然破棺而出爬橡,到底是詐尸還是另有隱情,我是刑警寧澤棒动,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布糙申,位于F島的核電站,受9級特大地震影響船惨,放射性物質(zhì)發(fā)生泄漏郭宝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一掷漱、第九天 我趴在偏房一處隱蔽的房頂上張望粘室。 院中可真熱鬧,春花似錦卜范、人聲如沸衔统。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锦爵。三九已至,卻和暖如春奥裸,著一層夾襖步出監(jiān)牢的瞬間险掀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工湾宙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留樟氢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓侠鳄,卻偏偏與公主長得像埠啃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伟恶,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容