我怎样才能在视图模型中保留 livedata 运行 即使片段被破坏?

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

我这里有 2 个 ui 页:主页片段和计时器片段

计时器片段的工作是在 viewModel 中显示 运行 的计时器计数器值。 但我的问题是当我回到主页片段并再次转到计时器片段时,计时器会重置并重新开始倒计时。那么有没有一种方法可以继续倒计时,即使我在计时器还剩 30 秒时弹出回到 HomeFragment 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

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

我的viewModel注入函数

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]

这样,viewmodel 实例将绑定到 activity 生命周期,只有当 activity 被销毁时,它才会被清除,即使您的片段是 destroyed.Let我知道你是否有任何困惑。

您的 ViewModelStoreOwner 应该是 Fragment 的父级 activity,以便 ViewModel 在 Fragment 创建和销毁之间持续存在。

在你的 injectViewModel 函数中做这样的事情:

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

使用此方法,您的 ViewModel 将绑定到您的 Activity 的生命周期,并且只会在您的 activity 被销毁后被销毁。