gpt4 book ai didi

java - Dagger 中字符串被多次绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 09:47:49 30 4
gpt4 key购买 nike

我在将字符串注入(inject) dagger 时遇到问题

这是我的实现

@Singleton
@Component(
modules = [AndroidInjectionModule::class,
ActivityBuilder::class,
ViewModelModule::class,
NetModule::class,
AppModule::class]
)
interface AppComponent : AndroidInjector<DaggerApplication> {

fun inject(theDApplication: TFTScreenApplication)

override fun inject(instance: DaggerApplication)

@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder

@BindsInstance
@Named(Constants.API_URL_KEY)
fun apiUrl(apiUrl: String): Builder

@BindsInstance
@Named(Constants.SOCKET_URL_KEY)
fun socketUrl(socketUrl: String): Builder

fun build(): AppComponent
}
}

然后在网络模块中

@Module
abstract class NetModule {

@Binds
@Named(Constants.API_URL_KEY)
abstract fun provideApiUrl(apiUrl: String): String

@Binds
@Named(Constants.SOCKET_URL_KEY)
abstract fun provideSocketUrl(socketUrl: String): String

@Module
companion object {

@Provides
@Reusable
@JvmStatic
fun providesOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}

@Provides
@Reusable
@JvmStatic
fun providesGson(): Gson {
val gsonBuilder = GsonBuilder()
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
return gsonBuilder.create()
}

@Provides
@Reusable
@JvmStatic
fun providesRetrofit(
@Named(Constants.API_URL_KEY) apiUrl: String, gson: Gson
): Retrofit {
return Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(apiUrl)
.build()
}

@Provides
@Reusable
@JvmStatic
fun providesBackOffStrategy(): BackoffStrategy {
return ExponentialWithJitterBackoffStrategy(5000, 5000)
}

@Provides
@Reusable
@JvmStatic
fun providesLifeCycle(application: Application): Lifecycle {
return AndroidLifecycle.ofApplicationForeground(application)
}

@Provides
@Reusable
@JvmStatic
fun providesScarlet(
@Named(Constants.SOCKET_URL_KEY) socketUrl: String, okHttpClient: OkHttpClient,
backoffStrategy: BackoffStrategy,
lifecycle: Lifecycle
): Scarlet {
return Scarlet.Builder()
.webSocketFactory(okHttpClient.newWebSocketFactory(socketUrl))
.addMessageAdapterFactory(MoshiMessageAdapter.Factory())
.addStreamAdapterFactory(RxJava2StreamAdapterFactory())
.backoffStrategy(backoffStrategy)
.lifecycle(lifecycle)
.build()
}

@Provides
@Reusable
@JvmStatic
fun providesCoinSocket(scarlet: Scarlet): SocketService {
return scarlet.create(SocketService::class.java)
}

@Provides
@Reusable
@JvmStatic
fun providesPISAPIs(retrofit: Retrofit): PISAPIs {
return retrofit.create(PISAPIs::class.java)
}
}

错误是

error: [Dagger/DuplicateBindings] java.lang.String is bound multiple times: public abstract interface AppComponent extends dagger.android.AndroidInjector { ^ @org.jetbrains.annotations.NotNull @Named("API_URL") @BindsInstance com.example.tftscreen.common.di.component.AppComponent.Builder com.example.tftscreen.common.di.component.AppComponent.Builder.apiUrl(String) @org.jetbrains.annotations.NotNull @Named("SOCKET_URL") @BindsInstance com.example.tftscreen.common.di.component.AppComponent.Builder com.example.tftscreen.common.di.component.AppComponent.Builder.socketUrl(String) java.lang.String is injected at com.example.tftscreen.common.di.module.NetModule.provideSocketUrl(socketUrl) @javax.inject.Named("SOCKET_URL") java.lang.String is injected at com.example.tftscreen.common.di.module.NetModule.providesScarlet(socketUrl, …) com.tinder.scarlet.Scarlet is injected at com.example.tftscreen.common.di.module.NetModule.providesCoinSocket(scarlet) com.example.tftscreen.pis.SocketService is injected at com.example.tftscreen.pis.data.PISRemoteRepository(socketService, …) com.example.tftscreen.pis.data.PISRemoteRepository is injected at com.example.tftscreen.pis.PISViewModel(pisRemoteRepository) com.example.tftscreen.pis.PISViewModel is injected at com.example.tftscreen.common.di.module.ViewModelModule.bindPISViewModel(pisViewModel) java.util.Map,javax.inject.Provider> is injected at com.example.tftscreen.common.presentationLayer.ViewModelFactory(creators) com.example.tftscreen.common.presentationLayer.ViewModelFactory is injected at com.example.tftscreen.common.di.module.ViewModelModule.provideViewModelFactory(viewModelFactory) androidx.lifecycle.ViewModelProvider.Factory is injected at com.example.tftscreen.pis.PISActivity.viewModelFactory com.example.tftscreen.pis.PISActivity is injected at dagger.android.AndroidInjector.inject(T) [com.example.tftscreen.common.di.component.AppComponent → com.example.tftscreen.common.di.module.ActivityBuilder_BindMainActivity.PISActivitySubcomponent] It is also requested at: com.example.tftscreen.common.di.module.NetModule.provideApiUrl(apiUrl)

最佳答案

@BindsInstance,当您需要在运行时将依赖项引入到对象图中时,这是最有用的。

@Binds 用于当您需要将接口(interface)绑定(bind)到实现时并且 dagger 可以为您构建具体的实现(通过 @Inject构造函数)

您的 Constants.SOCKET_URL_KEYConstants.API_URL_KEY 看起来不符合这两个条件,所以...

如果这些在编译时确实可用,并且您希望 dagger 提供这些,那么最简单的方法是将以下内容添加到您的模块中:

@Provides
@JvmStatic
@Named(Constants.API_URL_KEY)
fun providesApiUrlKey(): String {
return "YOUR_API_KEY"
}

并删除:

@BindsInstance
@Named(Constants.API_URL_KEY)
fun apiUrl(apiUrl: String): Builder

无论哪种情况(在运行时或编译时可用),您都需要删除它:

@Binds
@Named(Constants.API_URL_KEY)
abstract fun provideApiUrl(apiUrl: String): String

@Binds
@Named(Constants.SOCKET_URL_KEY)
abstract fun provideSocketUrl(socketUrl: String): String

关于java - Dagger 中字符串被多次绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527227/

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