【问题标题】:how to use a dagger fragment viewmodel in injected dagger fragment?如何在注入的匕首片段中使用匕首片段视图模型?
【发布时间】:2020-10-12 15:42:17
【问题描述】:

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

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您不能通过其构造函数将依赖项注入 Fragment。活动、广播接收器、服务、内容提供者和片段需要默认构造函数,因为操作系统使用反射 API 创建这些类的实例。 在我看来,你有 3 种方法可以解决这个问题:

    方式 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 时手动编写的所有魔法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多