gpt4 book ai didi

java - Android Dagger2 错误 : @javax. inject.Named ("BaseUrl") java.lang.String 被多次绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:02 26 4
gpt4 key购买 nike

我正在尝试使用 Dagger2 做一些事情,但仍然难以理解..

我想在 2 个类中使用 2 个服务,SplashActivity 和 HomeActivity。服务依赖于 NetModule,因为我想重用改造和 okhttpclient 提供。

这是我的网络模块:

@Module
public class NetModule {
@Provides
Retrofit provideRetrofit(@Named("BaseUrl") String baseUrl, OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
}

@Provides
HttpLoggingInterceptor provideHttpLoggingInterceptor() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
if (BuildConfig.DEBUG) {
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);
} else {
logging.setLevel(HttpLoggingInterceptor.Level.NONE);
}

return logging;
}

@Provides
OkHttpClient provideOkHttpClient(HttpLoggingInterceptor httpLoggingInterceptor, @Named("ConnectTimeoutMs") int connectTimeoutMs, @Named("ReadTimeoutMs") int readTimeoutMs) {
return new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(connectTimeoutMs, TimeUnit.MILLISECONDS)
.readTimeout(readTimeoutMs, TimeUnit.MILLISECONDS)
.build();
}
}

StaticDataModule 和 StatusModule,它是 2 个不同的 API,因此它们使用 NetModule:

@Module(includes = NetModule.class)
public class StaticDataModule {
@Provides
@Singleton
StaticDataService provideStaticDataService(Retrofit retrofit) {
return new RetrofitStaticDataService(retrofit);
}

@Provides
@Named("BaseUrl")
String provideBaseUrl() {
return "http://url_static.com";
}

@Provides
@Named("ConnectTimeoutMs")
int provideConnectTimeoutMs() {
return 5000;
}

@Provides
@Named("ReadTimeoutMs")
int provideReadTimeoutMs() {
return 5000;
}
}

@Module(includes = NetModule.class)
public class StatusModule {
@Provides
@Singleton
StatusService provideStatusService(Retrofit retrofit) {
return new RetrofitStatusService(retrofit);
}

@Provides
@Named("BaseUrl")
String provideBaseUrl() {
return "http://url_status.com";
}

@Provides
@Named("ConnectTimeoutMs")
int provideConnectTimeoutMs() {
return 5000;
}

@Provides
@Named("ReadTimeoutMs")
int provideReadTimeoutMs() {
return 5000;
}
}

我在这个组件中构建它们:

@Singleton
@Component(modules = {AppModule.class, StaticDataModule.class, StatusModule.class})
public interface AppComponent {
void inject(SplashActivity splashActivity);
void inject(HomeActivity homeActivity);
}

我收到此错误:@javax.inject.Named("BaseUrl") java.lang.String 被多次绑定(bind)。我理解我的错误,dagger 不知道谁在 StaticData baseUrl 和 Status baseUrl 之间提供。

我试图制作 2 个组件,StaticDataComponent 和 StatusComponent,但我不能在同一个 Activity 中注入(inject)这两个组件。

我尝试在 StaticDataModule 和 StatusModule 中扩展 NetModule,并使用构造函数提供参数,但在改造提供时出现多边界错误。

所以我不知道如何在 2 个模块中重用具有不同参数的 NetModule,如果有人有示例,它应该真的对我有帮助。

谢谢!

最佳答案

不要将 NetModule.class 作为模块的依赖项包含在内,只需将它们单独包含在组件中即可。

@Module(includes = NetModule.class)
public class StaticDataModule {

@Module
public class StaticDataModule {

然后像这样使用:

@Component(modules = {
NetModule.class, StaticDataModule.class
}) public interface FirstComponent {
void inject(WhateverYouWantActivity activity);
}

@Component(modules = {
NetModule.class, StatusModule.class
}) public interface FirstComponent {
void inject(WhateverYouWantSecondActivity activity);
}

如果你必须注入(inject)相同的 Activity ,你最好重新设计你的架构,但如果你仍然想这样做,你可以去掉注入(inject)方法,并添加如下内容:

@Component(modules = { /* your modules */ }) public interface YourComponent {

Retrofit getRetrofit();

OkHttpClient getOkHttpClient();
}

并相应地使用它:

retrofit = yourComponentBuiltByDagger.getRetrofit();

代替:

@Inject Retrofit retrofit;

关于java - Android Dagger2 错误 : @javax. inject.Named ("BaseUrl") java.lang.String 被多次绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526838/

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