简体   繁体   English

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

[英]How to inject SP via Dagger 2.11 with Kotlin?

I'm using Dagger 2 with Kotlin. 我正在将Dagger 2与Kotlin一起使用。 All works fine, but when I'm trying to Inject SharedPreferences to Activity my project doen't even creating. 一切正常,但是当我尝试向活动注入SharedPreferences时,我的项目甚至都没有创建。 Gradle Console says: Gradle控制台说:

di\\AppComponent.java:6: error: [dagger.android.AndroidInjector.inject(T)] android.content.SharedPreferences is not nullable, but is being provided by @org.jetbrains.annotations.Nullable @android.support.annotation.Nullable @Singleton @Provides android.content.SharedPreferences myapp.di.Modules.SharedPrefModule.providePreferences(android.content.Context) e: di \\ AppComponent.java:6:错误:[dagger.android.AndroidInjector.inject(T)] android.content.SharedPreferences不能为空,但由@ org.jetbrains.annotations.Nullable @ android.support.annotation提供.Nullable @Singleton @提供android.content.SharedPreferences myapp.di.Modules.SharedPrefModule.providePreferences(android.content.Context)e:

e: public abstract interface AppComponent { e: ^ e: e:公共抽象接口AppComponent {e:^ e:
at: android.content.SharedPreferences is injected at e: 在android.content.SharedPreferences注入在e:
myapp.mvp.StartScreen.StartActivity.sharedPref e: myapp.mvp.StartScreen.StartActivity.sharedPref e:
myapp.mvp.StartScreen.StartActivity is injected at e: myapp.mvp.StartScreen.StartActivity在以下位置注入:
dagger.android.AndroidInjector.inject(arg0) e: java.lang.IllegalStateException: failed to analyze: org.jetbrains.kotlin.kapt3.diagnostic.KaptError: Error while annotation processing dagger.android.AndroidInjector.inject(arg0)e:java.lang.IllegalStateException:无法分析:org.jetbrains.kotlin.kapt3.diagnostic.KaptError:批注处理时出错

SharedPreferencesModule: SharedPreferencesModule:

    @Module
class SharedPrefModule{

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

AppComponent: AppComponent:

    @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
    }
}

App: 应用程序:

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
}

Activity: 活动:

class StartActivity: AppCompatActivity(), HasActivityInjector {

    @Inject
    lateinit var activityInjector : DispatchingAndroidInjector<Activity>

    @Inject
    lateinit var sharedPref : SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.start_activity_layout)

//        var data = sharedPref.getString(SHARED_PREFERENCES_SETTINGS, "")
//        Log.d("tag", "data - $data")
    }

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM