HasActivityInjector在Android Dagger 2中无法解析

时间:2018-10-23 12:18:38

标签: android dependency-injection kotlin dagger-2

我试图在我的android应用程序中实现 HasActivityInjector ,但它显示了HasActivityInjector无法解决。在我在项目中使用的依赖项和插件下面-

apply plugin: 'kotlin-kapt'

implementation 'com.google.dagger:dagger:2.16'
kapt 'com.google.dagger:dagger-compiler:2.16'

这是我正在尝试的代码-

class RanoBoilerplateApplication : Application(), HasActivityInjector{
    @Inject
    lateinit var activityDispatchingAndroidInjector:
            DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> =
            activityDispatchingAndroidInjector
}

我不知道我还必须包含哪些其他依赖项才能工作,如果有人以前做过这些,请给我帮助。

找到最新的Dagger 2版本here

快乐编码:-)

7 个答案:

答案 0 :(得分:42)

如果有人在更新为2.24之后来到这里,则将其删除:https://github.com/google/dagger/commit/3bd8f707cb28fd0c5f3abb4f87658566f8b52c10

您可以改用HasAndroidInjector

答案 1 :(得分:9)

除了@mbonnin和@Subhan的答案外,还删除了起始版本2.24 Has{Activity,Fragment,Service,ContentProvider,BroadcastReceiver}。 如果仍要支持此旧实现,请使用同时支持HasAndroidInjectorHas{Activity,Fragment,Service,ContentProvider,BroadcastReceiver}的2.23版。

这是2.24版的外观

应用

class ExampleApp: Application(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

活动

class ExampleActivity: AppCompatActivity(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

片段

class MoreFragment: Fragment(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

答案 2 :(得分:6)

回答还为时已晚,但对匕首世界的新手来说可能有用!

已将其替换为HasAndroidInjector,以避免在Application类中实现多个Dagger接口(如HasActivityInjector,HasServiceInjector等)的样板。现在,您只需要实现HasAndroidInjector,如下所示:

class DaggerExampleApplication : Application(), HasAndroidInjector{

       @Inject lateinit var androidInjector : DispatchingAndroidInjector<Any>

       override fun androidInjector(): AndroidInjector<Any> = androidInjector
       override fun onCreate() {
         super.onCreate()
         //Your code
       }        
}

答案 3 :(得分:3)

我的依赖项如下:

false

如果您使用的是appcompat,则需要//Dagger implementation "com.google.dagger:dagger:${libs.dagger}" implementation "com.google.dagger:dagger-android:${libs.dagger}" implementation "com.google.dagger:dagger-android-support:${libs.dagger}" kapt "com.google.dagger:dagger-compiler:${libs.dagger}" kapt "com.google.dagger:dagger-android-processor:${libs.dagger}" 一个。 support是指所需的匕首版本(例如2.16)。 了解有关依赖项here的更多信息。

答案 4 :(得分:0)

HasActivityInjector是在新的dagger android支持模块中引入的。在您的 build.gradle 文件中包括以下依赖项。

kapt "com.google.dagger:dagger-android-processor:2.18"
implementation "com.google.dagger:dagger-android-support:2.18"

答案 5 :(得分:0)

如果您是Android开发者,并且使用Kotlin(以获得更快的代码并避免了很多样板代码),则可以使用 Koin -

面向Kotliin开发人员的实用的轻量级依赖注入框架。 用纯Kotlin编写,仅使用功能解析:无代理,无代码生成,无反射。

相信我,这比dagger2容易。您可以找到更多详细信息hereofficial website

答案 6 :(得分:0)

可能是迟到的答案,但新的 Dagger2 依赖项带有 DaggerAppCompatActivityDaggerFragment 类,这些类对于单独注入活动和片段很有用。因此,我们不再需要 HasActivityInjector、autoInjection 方法或类似的东西。