Dagger2学习仍然很困难,并且正在尝试学习。使用新的Dagger android设置了一个项目,以避免注入Activity类内部。到目前为止,它是可行的,但需要使用在presenter类中注入的改造。在AppComponent中添加了改造模块,但是apiService类方法从演示者类调用时为null。需要知道如何正确注射。
@Singleton
@Component(modules = {
/* Use AndroidInjectionModule.class if you're not using support library */
AndroidSupportInjectionModule.class,
AppModule.class,
BuildersModule.class,
RetrofitModule.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(BaseApplication application);
Builder retrofitModule(RetrofitModule retrofitModule);
AppComponent build();
}
void inject(BaseApplication app);
}
@Module
class AppModule {
@Provides
Context provideContext(BaseApplication application) {
return application.getApplicationContext();
}
}
@Module
public abstract class BuildersModule {
@ContributesAndroidInjector(modules = {SplashViewModule.class, SplashModule.class})
abstract SplashActivity bindSplashActivity();
// Add bindings for other sub-components here
}
public class BaseApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
//configure timber for logging
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
DaggerAppComponent
.builder()
.application(this)
.retrofitModule(new RetrofitModule())
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingAndroidInjector;
}
}
@Module
public class RetrofitModule {
//get retrofit instance
@Singleton
@Provides
public UserAuthService getRestService() {
Gson gson = new GsonBuilder()
.setLenient()
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getOkHttpClient())
.build();
return retrofit.create(UserAuthService.class);
}
}
public interface UserAuthService {
@GET("v2/5be345062f00006b00ca22c4")
Observable<Example> getExampleResponse();
}
@Module
public class SplashModule {
@Provides
SplashPresenter provideSplashPresenter(SplashView splashView) {
return new SplashPresenter(splashView);
}
}
@Module
public abstract class SplashViewModule {
@Binds
abstract SplashView provideSplashView(SplashActivity splashActivity);
}
class SplashPresenter extends BasePresenter<SplashView> {
@Inject
@Named(ValueConstants.MAIN_THREAD)
Scheduler mMainThread;
@Inject
@Named(ValueConstants.NEW_THREAD)
Scheduler mNewThread;
@Inject
UserAuthService userAuthService;
SplashPresenter(SplashView view) {
super(view);
}
//test purpose
public void sayHello() {
userAuthService.getExampleResponse()
.observeOn(mMainThread)
.subscribeOn(mNewThread)
.subscribe(new Observer<Example>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Example example) {
Timber.d("example %s", example.toString());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
}
});
}
}
此处“ userAuthService.getExampleResponse()”为空。我认为演示者需要了解RetrofitModule注入。所以我需要解决这个问题以及如何解决?
答案 0 :(得分:0)
我将这些依赖项添加到NSMutableAttributedString
的构造函数中,并向其中添加SplashPresenter
批注。 Dagger2支持构造函数注入,并且您需要的所有依赖项都是可以解决的(并且您也可以摆脱@Inject
)
SplashModule