【问题标题】:Dagger 2.15 - How to inject a dependency in Application classDagger 2.15 - 如何在应用程序类中注入依赖项
【发布时间】:2018-05-29 15:52:15
【问题描述】:

我无法在 DaggerApplication 类中注入依赖项

相关类如下

应用

class App : DaggerApplication() {

@Inject lateinit var mSomeClass : SomeClass // This is always NULL

override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    return DaggerAppComponent.builder().application(this).build()
 }


override fun onCreate() {
    super.onCreate()

    mSomeClass.initialize()  // mSomeClass is NULL
}

组件:

 @Singleton
 @Component(modules = [
    AndroidSupportInjectionModule::class,
    AppModule::class,
    ViewModelFactoryModule::class,
    BuildersModule::class
  ])
interface AppComponent : AndroidInjector<DaggerApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    fun application(application: Application): Builder

    fun build(): AppComponent
    }
}

AppModule 类:

    @Module
    class AppModule {

    @Provides
    fun provideSomeClass(context: Context) = SomeClass(context = context)
}

不确定缺少什么。

【问题讨论】:

  • 你有 java 和 kotlin 的混合体,请准确填写你正在尝试的语言
  • void inject(App app);appComponent.inject(this)
  • 请包含您的组件接口。
  • @EpicPandaForce,您能否详细说明您的声明?
  • 很确定这应该是interface AppComponent : AndroidInjector&lt;App&gt;

标签: android kotlin dagger-2


【解决方案1】:

我遇到了同样的问题,发现当在AppComponent 中使用DaggerApplication 时,我们无法在Application 类中调用inject(this)。因此,我们不能注入任何我认为的东西。

所以在 AppComponent 中你必须指定你的 Application 类而不是输入 DaggerApplication

你的AppComponent应该是这样的

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class})
public interface AppComponent extends AndroidInjector<MyApplication> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);
        AppComponent build();

    }

}

还有你的Application 班级

    public class MyApplication extends DaggerApplication {

        @Inject
        SomeClass mSomeClass;

        @Override
        public void onCreate() {
            super.onCreate();
            mSomeClass.initialize();
        }

        @Override
        protected AndroidInjector<MyApplication> applicationInjector() {
            AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
            appComponent.inject(this);
            return appComponent;
        }
        }

现在您可以注入Application 类。

小提示:如果我说错了请纠正我,我不是匕首专家:)

【讨论】:

  • 这项工作非常震惊。你说的没有错,你是我眼中的匕首专家。 tysm
【解决方案2】:

您应该实现 HasActivityInjector 及其方法。示例如下。希望会奏效。

class App : Application(), HasActivityInjector {

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

override fun onCreate() {
    super.onCreate()

    DaggerAppComponent
            .builder()
            .create(this)
            .inject(this)
}

override fun activityInjector(): AndroidInjector<Activity>? {
    return dispatchingAndroidInjector
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多