如何在注入的匕首片段中使用匕首片段视图模型?

时间:2020-10-12 15:42:17

标签: android android-fragments

我将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
    }

1 个答案:

答案 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时您手动编写的所有魔术