如何使用Kotlin通过Dagger 2.11注入SP?

时间:2018-07-29 16:12:11

标签: android kotlin dagger-2

我在Kotlin上使用Dagger 2。一切正常,但是当我尝试向活动注入SharedPreferences时,我的项目甚至都没有创建。 Gradle控制台说:

  

di \ AppComponent.java:6:错误:   [dagger.android.AndroidInjector.inject(T)]   android.content.SharedPreferences不可为空,但正在   由@ org.jetbrains.annotations.Nullable提供   @ android.support.annotation.Nullable @Singleton @Provides   android.content.SharedPreferences   myapp.di.Modules.SharedPrefModule.providePreferences(android.content.Context)   e:

     

e:公共抽象接口AppComponent {e:^ e:
  在:android.content.SharedPreferences注入到e:
  myapp.mvp.StartScreen.StartActivity.sharedPref e:
  myapp.mvp.StartScreen.StartActivity已插入e:
  dagger.android.AndroidInjector.inject(arg0)e:   java.lang.IllegalStateException:无法分析:   org.jetbrains.kotlin.kapt3.diagnostic.KaptError:时出错   注释处理

SharedPreferencesModule:

JOAmR
JOHN HOMR

AppComponent:

    @Module
class SharedPrefModule{

    @Provides
    @Singleton
     fun providePreferences (context : Context): SharedPreferences? {
        return context.getSharedPreferences(SHARED_PREFERENCES_SETTINGS, Context.MODE_PRIVATE)
    }
}

应用程序:

    @Singleton
@Component(modules=arrayOf(AppModule::class, AndroidSupportInjectionModule::class,
        SharedPrefModule::class, ActivityBuilder::class))
interface AppComponent {

    fun inject (app:App)

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(context: Application): Builder

        fun build(): AppComponent
    }
}

活动:

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

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.builder().build().inject(this)

    }

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

1 个答案:

答案 0 :(得分:0)

SharedPrefModule使用上下文来创建SharedPreferences实例,并且由于您不包括任何提供上下文的模块,因此Dagger可能无法创建SharedPreferences实例。