Android Dagger 可以协助将包含字符串的类注入到提供的改造实例中吗?

问题描述 投票:0回答:1

这里我有一个类,最初是一个带注释的注入类,名为 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 吗?

android kotlin dependency-injection retrofit2 dagger-2
1个回答
0
投票

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

这种方式非常适合我。

© www.soinside.com 2019 - 2024. All rights reserved.