Android从hilt提供

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

如何使参数从片段传输到使用刀柄的匕首模块?

我想要这样

@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()
   }
}
android dagger dagger-hilt
1个回答
2
投票

我们可以通过使用 @Binds 方法和 Qualifier 注解来实现这种需求。

在这里,我尝试提及可能对您的情况有所帮助的场景。(我不确定您的项目想法,但根据您的代码片段和我的想法,我将在这里提及该场景...)

  1. 定义自定义限定符注释,如下所示:

     @Qualifier
     @Retention(AnnotationRetention.BINARY)
     annotation class TypeQualifier(val value: Type)
    
  2. 这是修改后的模块。(您也可以根据您的要求进行修改。)

     @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 注释,请参阅 官方文档。

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