如何在注射匕首碎片中使用匕首碎片视图模型



我将dagger2用于DI,并为单个活动进行开发。所以我在开始主活动时注入了一个片段,这个片段也注入了这个视图模型。但当我在dagger碎片中注入视图模型时,问题就出现了。如果我在dagger片段中不使用constructor@Inject,ViewModel运行良好,但无法在MainActivity中注入。如果我在dagger片段中使用constructor@Inject,ViewModel不工作,并得到了类似的错误

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

我应该放弃一个吗?

主活动

@Inject
lateinit var myFolderFragment:MyFolderFragment

myFolderFragment:myFolderFragment

class MyFolderFragment  @Inject constructor(): DaggerFragment() {
@Inject
lateinit var viewModelFactory : ViewModelProvider.Factory
private val viewModel by viewModels<MyFolderViewModel> { viewModelFactory }
private lateinit var binding : FragmentMyfolderBinding
private var mActivity:Activity?=null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentMyfolderBinding.inflate(layoutInflater, container, false).apply {
viewmodel = viewModel
}
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
binding.lifecycleOwner = this.viewLifecycleOwner
}

不能通过Fragment的构造函数将依赖项注入Fragment。活动、BroadcastReceiver、服务、ContentProviders和Fragments需要默认构造函数,因为OS使用Reflection API创建这些类的实例。在我看来,你有三种方法来解决这个问题:

方式1(最难的一种(-使用FragmentFactory

方法2(容易取消(-直接注入onCreateView方法,它看起来像这个

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentMyfolderBinding.inflate(layoutInflater, container, false).apply {
(context as MyApplication).component.inject(this)
viewmodel = viewModel
}
return binding.root
}

方式3(更少的代码(-您可以使用Hilt来代替Dagger2,它将隐藏您在使用way 2时手动编写的所有魔法

最新更新