我将dagger2用于DI,并为单个活动进行开发。因此,我在启动主要活动时确实注入了一个片段,并且该片段也注入了这个视图模型。但是,当我在匕首片段中插入一个视图模型时,就会发生问题。如果我在匕首片段中不使用构造函数@Inject,则ViewModel可以正常工作,但不能在MainActivity中注入。如果我在匕首片段中使用构造函数@Inject,则ViewModel无法正常工作,并出现这样的错误
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
我应该放弃一个吗?
MainActivity
@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
}
答案 0 :(得分:1)
您不能通过其构造函数将依赖项注入Fragment。活动,广播接收器,服务,内容提供者和片段需要默认构造函数,因为操作系统使用反射API创建该类的实例。 我认为您可以通过3种方式解决此问题:
方式1(最困难的一种)-使用FragmentFactory
方法2(易于理解)-以(fun ((b, p), c) -> (b && p.SelectedInnerRow = Some c.Id, c))
方法直接注入,看起来像这样
onCreateView
方法3(更少的代码)-您可以使用Hilt代替 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
}
,它会隐藏使用Dagger2
时您手动编写的所有魔术