簡體   English   中英

即使片段被破壞,我如何保持 livedata 在視圖模型中運行?

[英]How can i keep livedata running in viewmodel even fragment is destroyed?

這里我有 2 個 ui 頁面:Home Fragment 和 Timer Fragment

在此處輸入圖像描述

計時器片段的工作是顯示在 viewModel 中運行的計時器計數器值。 但我的問題是當我回到家片段和 go 再次計時器片段時,計時器會重置並重新開始倒計時。 那么有沒有辦法繼續倒計時,即使我在計時器還剩 30 秒時彈回 Home Fragment Likes 並且我回到 HomeFragment 5 秒然后再次進入 TimerFragment 然后它顯示還剩 25 秒而不是從頭開始計數? 太感謝了

這是我的代碼 TimerViewModel.kt

lateinit var timer : CountDownTimer 
var timerData =  MutableLiveData<Long>()

fun startTimer(){
    timer = object : CountDownTimer(30000,1000){
        override fun onTick(millisUntilFinished: Long) {
            timerData.value = millisUntilFinished/1000
        }

        override fun onFinish() {
            timerData.value = 1000
        }
    }
    if (timerData.value==null){
        timer.start()
    }
}

TimerFragment.kt

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    viewModel = injectViewModel(viewModelFactory)
    val binding = FragmentTimerBinding.inflate(inflater, container, false)
    viewModel.startTimer()
    viewModel.timerData.observe(viewLifecycleOwner, Observer { result ->
        binding.timeLeft = result.toString()
    })
    return binding.root
}

在這里我如何使用導航從 homeFragment 到 TimerFragment 的 go

HomeFragmentDirections.actionHomeToTimerFragment()
it.findNavController().navigate(direction)

我的viewModel注入function

inline fun <reified T : ViewModel> Fragment.injectViewModel(factory: 
ViewModelProvider.Factory): T {
return ViewModelProviders.of(this, factory)[T::class.java]
}

使用 getActivity() 方法在片段中初始化 Viewmodel 示例: ViewModelProvider(requireActivity())[ViemodelName::class.java]

通過這種方式,視圖模型實例將綁定到活動生命周期,並且只有在活動被銷毀時才會被清除,即使您的片段被銷毀,您的計時器實例也不會被銷毀。如果您有任何困惑,請告訴我。

您的ViewModelStoreOwner應該是 Fragment 的父活動,以便 ViewModel 在 Fragment 創建和銷毀之間持續存在。

在您的injectViewModel function 中執行以下操作:

return ViewModelProvider(requireActivity(), viewModelFactory).(TimerViewModel::class.java)

使用這種方法,您的 ViewModel 將綁定到 Activity 的生命周期,並且只有在您的 Activity 被銷毀后才會被銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM