为什么AdnroidInjector.inject(fragment)使用不推荐使用的android.support.v4.app.Fragment

时间:2018-12-20 12:27:39

标签: android dagger-2 android-viewmodel androidinjector

我正在将Dagger2用于Android应用中的DI

我想通过AndroidInjector在片段中注入viewModel并具有这两行:

 AndroidInjection.inject(this)
 viewModel = ViewModelProviders.of(this, viewModelFactory).get(ProductDetailViewModel::class.java)

当我的片段扩展androidx.fragment.app.Fragment时显示此错误:

  • 第一行使用不推荐使用的android.support.v4.app.Fragment
  • 但是第二个使用android.app.Fragment

现在我不知道我的片段应该扩展哪一个!

选择其中一个时出现此错误:

None of the following functions can be called with the arguments supplied: public open fun inject(activity: Activity!): Unit defined in dagger.android.AndroidInjection public open fun inject(fragment: Fragment!): Unit defined in dagger.android.AndroidInjection public open fun inject(service: Service!): Unit defined in dagger.android.AndroidInjection public open fun inject(contentProvider: ContentProvider!): Unit defined in dagger.android.AndroidInjection

3 个答案:

答案 0 :(得分:2)

我的错误是使用dagger-android(而不是dagger-android-support),而dagger-android仅具有:

 AndroidInjection.inject(this)

但我应该使用

 AndroidSupportInjection.inject(this)

supportdLibrary版本的dagger-android-support

答案 1 :(得分:0)

androidx是重构的库名称空间。

  

AndroidX是对原始Android支持的重大改进   图书馆。与支持库一样,AndroidX与   Android操作系统,并提供跨Android的向后兼容性   发布。 AndroidX通过提供以下功能完全替代了支持库   功能奇偶校验和新库。see here

所以我建议您首先将代码迁移到androidx。 为此。

重构>迁移到Androidx。

和荣誉,您再也不会与库版本发生冲突了。

答案 2 :(得分:0)

Google向我们介绍了AndroidX,为了使所有开发人员都在同一页面上,他们不赞成使用Fragment,并且使支持片段成为AndroidX的一部分。因此,您必须与Jetpack的一部分的AnroidX一起为用户提供支持片段。...

Working demo