我一直在做一些关于一个片段,该片段具有依赖于WorkManager的视图模型。我曾经使用现在已弃用的方法WorkManager.getInstance()
获取工作管理器,因此我重构了代码,并遵循了与向日葵项目中相同的获取工作管理器实例的方法(此后已更改)。向日葵示例项目现在使用 NavArgs(),并且不再这样做:InjectorUtils.providePlantDetailViewModelFactory(requireActivity(), args.plantId)
我的问题是,由于使用 requireActivity() 获取 WorkManager 实例,在通过注入分配 viewModel 变量时是否可以抛出IllegalStateException
,就像下面的代码中一样?在分配此变量时,活动是否有可能不附加/被销毁?我应该重构并使用应用程序上下文而不是requireActivity()吗?
class DetailFragment : Fragment() {
private val viewModel by inject<ViewModel> { parametersOf(WorkManager.getInstance(requireActivity())) }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewDataBinding = DetailFragmentBinding.inflate(inflater, container, false).apply {
vm = viewModel.apply {
event.observe(this@DetailFragment, Observer {
viewDataBinding.refreshLayout.isRefreshing = false
})
}
}
return viewDataBinding.root
}
}
你应该基本上是安全的。但这只取决于你第一次在哪里得到viewModel
。您可以确保viewModel
在设置任何访问它的处理程序之前以onCreate
或onStart
进行初始化。
在您的情况下,它仅在onCreateView
中调用,因此它应该附加到Activity
并且因此是安全的。