gpt4 book ai didi

android - 如何在 Hilt 中生成相同类型的对象?

转载 作者:行者123 更新时间:2023-12-04 23:54:07 26 4
gpt4 key购买 nike

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Singleton
@Provides
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://example.com/")
.client(okHttpClient)
.build()
}

@Singleton
@Provides
fun provideMyRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http:/my.com/")
.client(okHttpClient)
.build()
}
}
他们的区别只是 baseUrl .

我试图通过使用 @Qualifier 来解决这个问题.
interface RetrofitQualifier {
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class Retrofit

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class MyRetrofit
}
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

@Singleton
@Provides
@RetrofitQualifier.Retrofit
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://example.com/")
.client(okHttpClient)
.build()
}

@Singleton
@Provides
@RetrofitQualifier.MyRetrofit
fun provideMyRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http:/my.com/")
.client(okHttpClient)
.build()
}
}

我通过使用 @RetrofitQualifier.MyRetrofit 来使用它在我的课上:
class MyRepository @Inject constructor(
application: Application
) {

...

@Inject
@RetrofitQualifier.MyRetrofit
lateinit var retrofit:Retrofit


private val service: Service = retrofit.create(Service::class.java)

...

}
但是,我失败了,日志是
kotlin.UninitializedPropertyAccessException: lateinit property retrofit has not been initialized
我应该怎么办?也许使用 @Named ?我不知道...

最佳答案

Qualifier 的示例,您可以将其添加到您的提供程序所在的同一文件中,甚至可以创建一个 RetrofitQualifier.kt文件并将它们添加到那里。

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class RetrofitOne

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class RetrofitTwo
@Provides
@Singleton
@Provides
@RetrofitOne
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://example.com/")
.client(okHttpClient)
.build()
}

@Singleton
@Provides
@RetrofitTwo
fun provideMyRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http:/my.com/")
.client(okHttpClient)
.build()
}
然后在你的 Repository您可以使用两个选项进行注入(inject)
现场注入(inject)
// At field injection.
@AndroidEntryPoint
class MyRepository @Inject constructor(...) {

@RetrofitOne
@Inject lateinit var retrofit: Retrofit
}
作为依赖注入(inject)构造函数类
// As a dependency of a constructor-injected class.
class MyRepository @Inject constructor(
@RetrofitTwo private val retrofit: Retrofit
) : ...

但问题是,也许您安装在另一个模块中,您的存储库没有可见性。
关于 @Named您仍然可以使用它,但根据文档建议使用 Qualifier

关于android - 如何在 Hilt 中生成相同类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68587320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com