Android 我应该如何在改装时使用Dagger2?

Android 我应该如何在改装时使用Dagger2?,android,kotlin,retrofit,dagger-2,Android,Kotlin,Retrofit,Dagger 2,我在一个项目中工作,我需要用匕首2注入改造对象。我搜索信息,但我只能执行几个步骤,现在我不知道如何继续: 我的组成部分: @Singleton @Component(modules = arrayOf(NetworkModule::class)) interface NetworkComponent { fun inject(foo: TheApplication) } 我的模块: @Module class NetworkModule { @Provides @Si

我在一个项目中工作,我需要用匕首2注入改造对象。我搜索信息,但我只能执行几个步骤,现在我不知道如何继续:

我的组成部分:

@Singleton
@Component(modules = arrayOf(NetworkModule::class))
interface NetworkComponent {
    fun inject(foo: TheApplication)
}
我的模块:

@Module
class NetworkModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.chucknorris.io/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
    }

}
现在我明白了,我必须创建一个
,它从
应用程序
扩展到
组件
,然后创建一个
@Inject
下一步:

class TheApplication: Application() {

    override fun onCreate() {
        super.onCreate()
        val net: NetworkModule = Dagger...
    }
}
理论上,当我放置
Dagger…
时,它应该是
DaggerNetworkComponent
,但我重建了项目,仍然丢失了它。 任何人都可以向我解释什么是
应用程序.class
以及我如何继续?

试试这个

AppComponent.kt

NetworkModule.kt

AndroidManifest.xml


请分享你的
组件
代码我发布了一个组件代码,我不知道它是否与你问我的相同。为什么你的
@组件
被称为
网络模块
,出于某种原因,它经常称自己为模块?当您的实际网络模块被称为
NetworksModule
时,名称是随机选择的,与它们无关。您的代码看起来一切正常。我假设dagger注释处理器未连接或未配置。检查dagger annotation processor是否通过“kapt”配置而不是“annotatinProcessor”作为依赖项添加到dagger annotation processor中
MyApp
Application
类,我已使用应用程序创建了
AppComponent
scope@David其他提供程序方法用于提供拦截器和
OkHttpClient
的依赖项。您可以根据您的用例删除/修改它。如果这不是很多工作,您能解释一下为什么我应该使用
应用程序
类来初始化要注入的类中的
DaggerNetworkComponent
?(你怎么知道我是最新的匕首2)。现在,我该如何注入
改造
?@David,很抱歉,我没听清你的问题!但根据我的理解,我刚刚使用了
Application
类来定义应用程序级别的
AppComponent
。正如您在
appcoment
中定义的
fun inject(app:MyApp)
一样,需要在应用程序类中注入组件。@David,例如,假设我想使用WebApi,然后
@inject lateinit var WebApi:WebApi
@Component(modules = [NetworkModule::class]) 
@Singleton 
interface AppComponent {
    fun inject(app: MyApp)
}
@Module
class NetworkModule {

    @Singleton
    @Provides
    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("YOUR_BASE_URL")
            .client(okHttpClient)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
    }

    @Singleton
    @Provides
    fun provideApi(retrofit: Retrofit): WebApi {
        return retrofit.create(WebApi::class.java)
    }

    @Singleton
    @Provides
    fun provideOkHttpClient(
        interceptors: ArrayList<Interceptor>
    ): OkHttpClient {
        val clientBuilder = OkHttpClient.Builder()
            .followRedirects(false)
        interceptors.forEach {
            clientBuilder.addInterceptor(it)
        }
        return clientBuilder.build()
    }


    @Singleton
    @Provides
    fun provideInterceptors(): ArrayList<Interceptor> {
        val interceptors = arrayListOf<Interceptor>()
        val loggingInterceptor = HttpLoggingInterceptor().apply {
            level = if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor.Level.BODY
            } else {
                HttpLoggingInterceptor.Level.NONE
            }
        }
        interceptors.add(loggingInterceptor)
        return interceptors
    }
}
class MyApp : Application() {
    companion object {
        lateinit var instance: MyApp
            private set
    }

    lateinit var appComponent: AppComponent
        private set


    override fun onCreate() {
        super.onCreate()
        instance = this
        initComponent()
    }

    private fun initComponent() {
        appComponent = DaggerAppComponent.builder()
            .build()
        appComponent.inject(this)
    }
}
<application
            android:name=".MyApp"
            ....