簡體   English   中英

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

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

我正在將Dagger 2與Kotlin一起使用。 一切正常,但是當我嘗試向活動注入SharedPreferences時,我的項目甚至都沒有創建。 Gradle控制台說:

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:公共抽象接口AppComponent {e:^ e:
在android.content.SharedPreferences注入在e:
myapp.mvp.StartScreen.StartActivity.sharedPref e:
myapp.mvp.StartScreen.StartActivity在以下位置注入:
dagger.android.AndroidInjector.inject(arg0)e:java.lang.IllegalStateException:無法分析:org.jetbrains.kotlin.kapt3.diagnostic.KaptError:批注處理時出錯

SharedPreferencesModule:

    @Module
class SharedPrefModule{

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

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

應用程序:

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
}

活動:

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