如何使参数从片段传输到使用刀柄的匕首模块?
我想要这样
@Module
@InstallIn(SingletonComponent::class)
class TestModule {
@Singleton
@Provides
fun provideAccountApi(type: Type): AccountApi = when (type) {
Type.Type_1 -> retrofitProvider.newInstance<AccountType1Api>().create()
else -> retrofitProvider.newInstance<AccountType2Api>().create()
}
}
我们可以通过使用 @Binds 方法和 Qualifier 注解来实现这种需求。
在这里,我尝试提及可能对您的情况有所帮助的场景。(我不确定您的项目想法,但根据您的代码片段和我的想法,我将在这里提及该场景...)
定义自定义限定符注释,如下所示:
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class TypeQualifier(val value: Type)
这是修改后的模块。(您也可以根据您的要求进行修改。)
@Module
@InstallIn(SingletonComponent::class)
object TestModule {
@Singleton
@Provides
fun provideRetrofit(): Retrofit {
// Provide your Retrofit instance here.
}
@TypeQualifier(Type.Type_1)
@Provides
fun provideAccountType1Api(retrofit: Retrofit): AccountApi {
return retrofit.create(AccountType1Api::class.java)
}
@TypeQualifier(Type.Type_2)
@Provides
fun provideAccountType2Api(retrofit: Retrofit): AccountApi {
return retrofit.create(AccountType2Api::class.java)
}
@Binds
abstract fun bindType(type: Type): Type
@Singleton
@Provides
fun provideAccountApi(@TypeQualifier type: Type, @TypeQualifier(Type.Type_1) type1Api: AccountApi, @TypeQualifier(Type.Type_2) type2Api: AccountApi): AccountApi {
return when (type) {
Type.Type_1 -> type1Api
Type.Type_2 -> type2Api
}
}
}
现在,您可以将动态类型注入到您的 Activity 或片段中,Hilt 将根据所选类型提供适当的 AccountApi 实例。
@AndroidEntryPoint
class YourActivity : AppCompatActivity() {
@Inject
lateinit var type: Type
@Inject
lateinit var accountApi: AccountApi
// ...
fun someMethod() {
// You can use 'type' and 'accountApi' here.
}
}
注意:此片段供您参考,您必须根据您的要求以及您在项目中使用的架构(干净架构、MVVM 等)对其进行修改。
另外,如果您不了解 Qualifier 注释,请参阅 官方文档。