私はDagger2といくつかのことをしようとしているが、依然として困難を理解すること。..アンドロイドDagger2エラー:javax.inject.Named @(「BASEURL」)java.lang.Stringではバインドされている複数回
私はしたいと思いますSplashActivityとHomeActivityの2つのクラスで2つのサービスを使用します。 サービスはNetModuleに依存しています。これは、再利用retrofitとokhttpclientが提供したいからです。ここで
は私NetModuleです:@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、それは彼らがNetModule使用して2貴様APIです:
@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は複数にバインドされています回。 私は自分のエラーを理解しています。ダガーはStaticData baseUrlとStatus baseUrlの間に誰が提供しているのか知りません。
StaticDataComponentとStatusComponentの2つのコンポーネントを作成しようとしましたが、同じアクティビティで両方を注入できません。
StaticDataModuleとStatusModuleでNetModuleを拡張しようとしましたが、コンストラクタでパラメータを指定しましたが、複数の境界エラーがretrofitで提供されました。
私は2つのモジュールのdifferentsパラメータでNetModuleを再利用する方法を知りません。
ありがとうございます!
最も簡単なことは、次のようにすることができます:StatusBaseUrlとStaticBaseUrlに名前を変更する –
しかし、NetModule for baseUrlには何が必要ですか?私は@Named( "Something")を書く必要がありますか? – Lyofen
または、同じ名前を使用しますが、NetModuleを依存関係として含めないでください。 2番目のコンポーネント(NetModule +静的モジュール)の1つのコンポーネント(NetModule +ステータスモジュール)に使用 –