这里我有一个类,最初是一个带注释的注入类,名为 AppConfig
class AppConfig @Inject constructor() {
val configBaseURL1 : String = "baseURL1"
val configBaseURL2 : String = "baseURL2"
val configAppVer : String = "1.0.0"
}
这个类被注入到一个为我提供 RetrofitService 的函数中
@Module
class RetrofitModule {
@Provides
fun getRetrofit(appConfig: AppConfig, okHttpClient: OkHttpClient, moshiConverterFactory: MoshiConverterFactory) : MyRetrofitService {
return Retrofit.Builder()
.baseUrl(appConfig.configBaseURL1)
.client(okHttpClient)
.addConverterFactory(moshiConverterFactory)
.build()
.create(MyRetrofitService::class.java)
}
}
okHttpClient、moshiConverterFactory 都在单独的模块中提供。
这最初工作得很好,因为我运行了提供不同 configBaseURL 字符串的构建变体,但现在我不需要这样做,而是使用包含两个 URL 字符串的 appConfig 类,并且我需要使用基于 app 中的布尔标志的任一字符串运行。如果在编译时创建 RetrofitModule 及其关联的注入参数,我该如何完成此任务?我尝试使用 @AssistedFactory 工厂将布尔值封装在 @AssistedInject 类中,但出现以下错误:
Dagger does not support providing @AssistedInject types.
我想我是根据其他类似回复的帖子来理解的。有关如何实现它的任何提示,以便我可以在运行时提供带有基于布尔标志的 configBaseURL 的 RetrofitService 吗?
@Inject 注解用于自动初始化变量的引用。所以你不应该在AppConfig类中使用@Inject。相反,我在改造中使用基本网址,如下所示
class AppConfig {
companion object {
const val configBaseURL1 : String = "baseURL1"
const val configBaseURL2 : String = "baseURL2"
const val configAppVer : String = "1.0.0"
}
}
通常我更喜欢创建一个模块类并在那里创建所有函数。所以我会像这样使用它。
@Module
@InstallIn(SingletonComponent::class)
class RetrofitModule {
@Provides
fun provideBaseUrl() = AppConfig.configBaseURL1
@Provides
fun getRetrofit(configBaseURL1: String, okHttpClient: OkHttpClient, moshiConverterFactory: MoshiConverterFactory) : MyRetrofitService {
return Retrofit.Builder()
.baseUrl(configBaseURL1)
.client(okHttpClient)
.addConverterFactory(moshiConverterFactory)
.build()
.create(MyRetrofitService::class.java)
}
}
这种方式非常适合我。