Android 如何提供匕首2的上下文?
我正在创建一个应用程序,它使用Dagger注入一些依赖项 我创建了一些模块类,但其中一个需要上下文。问题是我不知道如何以正确的方式提供上下文。我尝试了很多解决方案,但每次都有例外: @Component.Builder缺少所需模块或组件的设置程序:[com.mamak.geobaza.di.ContextModule] 我应该如何以正确的方式提供上下文 apimule.ktAndroid 如何提供匕首2的上下文?,android,kotlin,dagger,Android,Kotlin,Dagger,我正在创建一个应用程序,它使用Dagger注入一些依赖项 我创建了一些模块类,但其中一个需要上下文。问题是我不知道如何以正确的方式提供上下文。我尝试了很多解决方案,但每次都有例外: @Component.Builder缺少所需模块或组件的设置程序:[com.mamak.geobaza.di.ContextModule] 我应该如何以正确的方式提供上下文 apimule.kt package com.mamak.geobaza.di import com.google.gson.Gson imp
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
接口模块.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
OkHttpModule.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
projectapimule.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
RxJavaModule.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
ViewModelKey.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
ContextModule.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
AppComponent.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
AppController.kt
package com.mamak.geobaza.di
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.mamak.geobaza.utils.AppConstans.BASE_URL
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
@Module(includes = [
RxJavaModule::class,
OkHttpModule::class
])
class ApiModule {
@Provides
@Singleton
fun gson(): Gson {
return GsonBuilder().create()
}
@Provides
@Singleton
fun gsonConverterFactory(gson: Gson): GsonConverterFactory {
return GsonConverterFactory.create(gson)
}
@Provides
@Singleton
fun retrofit(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava2CallAdapterFactory: RxJava2CallAdapterFactory
): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJava2CallAdapterFactory)
.build()
}
}
package com.mamak.geobaza.di
import android.content.Context
import com.mamak.geobaza.ui.`interface`.ProjectListItemInterfaceImpl
import dagger.Module
import dagger.Provides
import javax.inject.Singleton
@Module(includes = [
ContextModule::class
])
class InterfaceModule {
@Provides
@Singleton
fun projectListItemInterface(context: Context): ProjectListItemInterfaceImpl {
return ProjectListItemInterfaceImpl(context)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import java.util.concurrent.TimeUnit
import javax.inject.Singleton
@Module
class OkHttpModule {
@Provides
@Singleton
fun okHttpLoggingInterceptor(): HttpLoggingInterceptor {
return HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY)
}
@Provides
@Singleton
fun okHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
}
}
package com.mamak.geobaza.di
import com.mamak.geobaza.network.api.ProjectApiService
import dagger.Module
import retrofit2.Retrofit
@Module(includes = [
ApiModule::class
])
class ProjectApiModule {
fun projectApiService(retrofit: Retrofit): ProjectApiService {
return retrofit.create(ProjectApiService::class.java)
}
}
package com.mamak.geobaza.di
import dagger.Module
import dagger.Provides
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import javax.inject.Singleton
@Module
class RxJavaModule {
@Provides
@Singleton
fun rxJavaCallAdapterFactory(): RxJava2CallAdapterFactory {
return RxJava2CallAdapterFactory.create()
}
}
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import dagger.MapKey
import kotlin.reflect.KClass
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
package com.mamak.geobaza.di
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import com.mamak.geobaza.factory.ViewModelFactory
import com.mamak.geobaza.ui.viewmodel.ProjectListViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
@Module
internal abstract class ViewModelModule {
@Binds
internal abstract fun viewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory
@Binds
@IntoMap
@ViewModelKey(ProjectListViewModel::class)
protected abstract fun projectListViewModel(projectListViewModel: ProjectListViewModel): ViewModel
}
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
class ContextModule constructor(val context: Context) {
@Provides
fun context(): Context {
return context
}
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
@BindsInstance
fun contextModule(contextModule: ContextModule): Builder
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
.contextModule(ContextModule(this))
.build()
.inject(this)
}
}
package com.mamak.geobaza.di
导入android.app.Application
导入dagger.android.android喷射器
导入dagger.android.dispatchingandroid
导入dagger.android.hassandroidInjector
导入javax.inject.inject
类AppController:Application(),hasAndroidjector{
@注入
lateinit var分派AndroidInjector:分派AndroidInjector
覆盖有趣的AndroidJector():AndroidJector{
回程调度和回程调度
}
重写fun onCreate(){
super.onCreate()
DaggerAppComponent.Builder()
.申请书(本)
.apiModule(apiModule())
.interfaceModule(interfaceModule())
.contextModule(contextModule(this))
.build()
.注入(这个)
}
}
您都擅长使用@Component.Builder,但它可以进一步优化
以下是变化:
步骤1:在上下文模块中使用@Binds
提供上下文
package com.mamak.geobaza.di
import android.content.Context
import dagger.Module
import dagger.Provides
@Module
abstract class ContextModule { // to allow abstract method make module abstract
//@Binds works on an abstract method
@Singleton
@Binds // @Binds, binds the Application instance to Context
abstract fun context(appInstance:Application): Context //just return the super-type you need
}
步骤2:从AppComponent
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
// @BindsInstance //this two commented lines can be removed
// fun contextModule(contextModule: ContextModule): Builder
// why? because dagger already knows how to provide Context Module
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
// .contextModule(ContextModule(this)) //this line can be removed
.build()
.inject(this)
}
}
步骤3:修改组件生成器以利用@Component.Builder
和@Binds
package com.mamak.geobaza.di
import android.app.Application
import dagger.BindsInstance
import dagger.Component
import dagger.android.support.AndroidSupportInjectionModule
import javax.inject.Singleton
@Singleton
@Component(modules = [
ApiModule::class,
ViewModelModule::class,
AndroidSupportInjectionModule::class,
InterfaceModule::class,
ContextModule::class
])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
@BindsInstance
fun apiModule(apiModule: ApiModule): Builder
@BindsInstance
fun interfaceModule(interfaceModule: InterfaceModule): Builder
// @BindsInstance //this two commented lines can be removed
// fun contextModule(contextModule: ContextModule): Builder
// why? because dagger already knows how to provide Context Module
fun build(): AppComponent
}
fun inject(appController: AppController)
}
package com.mamak.geobaza.di
import android.app.Application
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject
class AppController : Application(), HasAndroidInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
override fun androidInjector(): AndroidInjector<Any> {
return dispatchingAndroidInjector
}
override fun onCreate() {
super.onCreate()
DaggerAppComponent.Builder()
.application(this)
.apiModule(ApiModule())
.interfaceModule(InterfaceModule())
// .contextModule(ContextModule(this)) //this line can be removed
.build()
.inject(this)
}
}
package com.mamak.geobaza.di
导入android.app.Application
导入dagger.android.android喷射器
导入dagger.android.dispatchingandroid
导入dagger.android.hassandroidInjector
导入javax.inject.inject
类AppController:Application(),hasAndroidjector{
@注入
lateinit var分派AndroidInjector:分派AndroidInjector
覆盖有趣的AndroidJector():AndroidJector{
回程调度和回程调度
}
重写fun onCreate(){
super.onCreate()
DaggerAppComponent.Builder()
.申请书(本)
.apiModule(apiModule())
.interfaceModule(interfaceModule())
//.contextModule(contextModule(this))//可以删除此行
.build()
.注入(这个)
}
}
通过添加以下代码来添加新模块
@Module
class ApplicationModule(var app: App) {
@Provides
@Singleton
fun provideApp(): App = app
@Provides
@Singleton
fun provideContext(): Context = app.applicationContext
}
然后将此模块添加到组件接口中
@Component(modules = arrayOf(ApplicationModule::class))
最后,在应用程序(类App:android.App.Application()
)类中创建组件
通过使用
组件工厂
方法,可以避免手动实例化模块。请检查下面的示例
@Component(
modules = [ApplicationModule::class]
)
@Singleton
interface ApplicationComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): ApplicationComponent
}
}
在应用程序类中,初始化对象图,如下所示
class MyApplication : Application() {
lateinit var applicationComponent: ApplicationComponent
override fun onCreate() {
super.onCreate()
applicationComponent = DaggerApplicationComponent.factory().create(this)
}
}
现在,
上下文
将可在对象图中的任何位置注入。您是否查看了与使用Dagger相关的google示例?您能否在应用程序类中的组件生成器中的接口模块
之前实例化上下文模块
。我将尝试在我的项目中使用它们,或者将它们连接到下面的答案。谢谢您的回答。我将在我的项目中使用它并给出反馈。它与以前一样工作,但现在我得到:@Component.Builder缺少所需模块或组件的setter:[com.mamak.geobaza.di.ApplicationModule]。由于您的设置与此不同,请删除所有组件,然后在上面安装live,然后根据您的步骤添加模块,但仍然存在相同的错误@iCantC上面的答案是可行的,但是需要上下文的ProjectListItemInterfaceImpl(由InterfaceModule提供)仍然没有初始化。谢谢你的答案。我会尝试一下并给出反馈。好的,一切正常,而不是使用InterfaceModule。当我在活动中对ProjectListItemInterfaceImpl使用@Inject注释时,我得到一个异常-lateinit属性ProjectListItemInterfaceImpl尚未初始化。我创建了提供毕加索的毕加索模块。当我使用上下文创建毕加索对象时,一切都正常。毕加索在我的活动中被正确初始化。似乎我在创建InterfaceModule或ProjectListItemInterfaceImpl时犯了一个错误。所以,非常感谢你的回答。现在在我的项目工作中提供上下文!谢谢你的回答。我很快会检查它。是否应该使用fun create(@BindsInstance@AppContext-context:context):ApplicationComponent
这样的限定符来区分它和活动上下文?另外,是否需要添加带有上下文的模块,或者这是不必要的。