requireActivity() 或在片段中实例化 WorkManager 时获取应用程序上下文



我一直在做一些关于一个片段,该片段具有依赖于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在设置任何访问它的处理程序之前以onCreateonStart进行初始化。

在您的情况下,它仅在onCreateView中调用,因此它应该附加到Activity并且因此是安全的。

最新更新