Ant*_*kov 3 android dagger-2 retrofit2
我在使用MVP时将Dagger 2与retrofit2库一起使用。一切顺利,直到我尝试集成另一个服务(基本上我试图将另一个改造对象初始化到另一个服务)。我遵循了这个答案,但是没有成功。
每次遇到错误时,我的每个片段和应用程序类似乎都无法识别组件类。
错误:找不到符号类DaggerApplicationComponent错误:找不到符号类DaggerEpisodeComponent
码
应用组件
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Retrofit exposeStreamingRetrofit();
Retrofit exposeRetrofit();
Context exposeContext();
AppPreferenceHelper exposePrefs();
}
Run Code Online (Sandbox Code Playgroud)
应用模块
@Module
public class ApplicationModule
{
private String mBaseUrl;
private Context mContext;
private AppPreferenceHelper mPrefsHelper;
public ApplicationModule(Context context,String baseUrl)
{
mContext = context;
mBaseUrl = baseUrl;
mPrefsHelper = new AppPreferenceHelper(context, Consts.PREF_NAME);
}
@Singleton
@Provides
GsonConverterFactory provideGsonConverterFactory()
{
GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create();
return gsonConverterFactory;
}
@Singleton
@Provides
@Named("ok-1")
OkHttpClient provideOkHttpClient()
{
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
return new OkHttpClient().newBuilder()
.connectTimeout(500, TimeUnit.MILLISECONDS)
.readTimeout(500,TimeUnit.MILLISECONDS)
.addInterceptor(logging)
.build();
}
@Singleton
@Provides
RxJava2CallAdapterFactory provideRxJava2CallAdapterFactory()
{
return RxJava2CallAdapterFactory.create();
}
@Provides
@Singleton
Retrofit provideRetrofit(@Named("ok-1") OkHttpClient client, GsonConverterFactory convectorFactory, RxJava2CallAdapterFactory adapterFactory)
{
return new Retrofit.Builder()
.baseUrl(mBaseUrl)
.addConverterFactory(convectorFactory)
.addCallAdapterFactory(adapterFactory)
.client(client)
.build();
}
@Provides
@Singleton
Retrofit provideStreamingRetrofit(@Named("ok-1") OkHttpClient client, GsonConverterFactory convectorFactory, RxJava2CallAdapterFactory adapterFactory) {
return new Retrofit.Builder()
.baseUrl(Consts.STREAMING_BASE_PATH)
.addConverterFactory(convectorFactory)
.addCallAdapterFactory(adapterFactory)
.client(client)
.build();
}
@Singleton
@Provides
Context provideContext()
{
return mContext;
}
@Singleton
@Provides
AppPreferenceHelper provideAppPreferenceHelper(){
return mPrefsHelper;
}
}
Run Code Online (Sandbox Code Playgroud)
流服务
public interface StreamingService
{
@GET("search")
Observable<StreamingItems> getStreamingItems(@Query("keyword") String query);
}
Run Code Online (Sandbox Code Playgroud)
流模块 @Module
public class StreamingModule
{
private StreamingView mView;
public StreamingModule(StreamingView view)
{
mView = view;
}
@PerFragment
@Provides
StreamingService provideStreamingService(Retrofit retrofit)
{
return retrofit.create(StreamingService.class);
}
@PerFragment
@Provides
StreamingView provideView()
{
return mView;
}
public void disposeView()
{
mView = null;
}
}
Run Code Online (Sandbox Code Playgroud)
流组件
@PerFragment
@Component(modules = StreamingModule.class, dependencies = ApplicationComponent.class)
public interface StreamingComponent {
void inject(StreamingFragment streamingFragment);
}
Run Code Online (Sandbox Code Playgroud)
串流主持人
public class StreamingPresenter extends BasePresenter<StreamingView>
{
private long mMaxPagesOfTopSeries;
@Inject
protected StreamingService mApiService;
@Inject
protected Mapper mTopSeriesMapper;
@Inject
protected AppPreferenceHelper mPrefsHelper;
@Inject
public StreamingPresenter()
{
mMaxPagesOfTopSeries = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
该问题可能与组件应用程序类中暴露Retrofit的另一个实例有关,但我不确定。
更新1
情节模块
@PerFragment
@Component (modules = EpisodeModule.class, dependencies = ApplicationComponent.class)
public interface EpisodeComponent
{
void inject(EpisodeFragment episodeFragment);
}
Run Code Online (Sandbox Code Playgroud)
创建流类(服务,演示者,模块,组件)后,我没有在其他类中进行任何更改,因此我认为问题出在应用程序模块/组件或流类中,但是我不确定,因为我可能会更改其他片段的改造对象,因为我添加了新的流改造实例。
没错,问题是应用程序模块中第二个Retrofit公开实例。解决方案是使用匕首限定符。只需将适当的代码块替换为:
@Named("streaming")在应用程序模块中使用限定符定义改造提供者
@Provides
@Singleton
@Named("streaming")
Retrofit provideStreamingRetrofit(@Named("ok-1") OkHttpClient client, GsonConverterFactory convectorFactory, RxJava2CallAdapterFactory adapterFactory) {
return new Retrofit.Builder()
.baseUrl(Consts.STREAMING_BASE_PATH)
.addConverterFactory(convectorFactory)
.addCallAdapterFactory(adapterFactory)
.client(client)
.build();
}
Run Code Online (Sandbox Code Playgroud)
不要忘记在应用程序组件中使用完全相同的限定符公开改造实例
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
@Named("streaming") Retrofit exposeStreamingRetrofit();
Retrofit exposeRetrofit();
Context exposeContext();
AppPreferenceHelper exposePrefs();
}
Run Code Online (Sandbox Code Playgroud)
每当您需要流服务改造实例时,请不要忘记设置限定符。流模块中的示例
@PerFragment
@Provides
StreamingService provideStreamingService(@Named("streaming") Retrofit retrofit) {
return retrofit.create(StreamingService.class);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |