Dagger2:如何在演示者类中注入改造模块

时间:2018-11-08 11:02:01

标签: java android dagger-2 dagger

Dagger2学习仍然很困难,并且正在尝试学习。使用新的Dagger android设置了一个项目,以避免注入Activity类内部。到目前为止,它是可行的,但需要使用在presenter类中注入的改造。在AppComponent中添加了改造模块,但是apiService类方法从演示者类调用时为null。需要知道如何正确注射。

AppComponent.java

@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);
}

AppModule.java

@Module
class AppModule {

    @Provides
    Context provideContext(BaseApplication application) {
        return application.getApplicationContext();
    }
}

BuildersModule.java

@Module
public abstract class BuildersModule {

    @ContributesAndroidInjector(modules = {SplashViewModule.class, SplashModule.class})
    abstract SplashActivity bindSplashActivity();

    // Add bindings for other sub-components here
}

BaseApplication.java

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;
    }
}

RetrofitModule.java

@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);
    }
}

UserAuthService.java

public interface UserAuthService {

    @GET("v2/5be345062f00006b00ca22c4")
    Observable<Example> getExampleResponse();
}

SplashModule.java

@Module
public class SplashModule {

    @Provides
    SplashPresenter provideSplashPresenter(SplashView splashView) {
        return new SplashPresenter(splashView);
    }
}

SplashViewModule.java

@Module
public abstract class SplashViewModule {

    @Binds
    abstract SplashView provideSplashView(SplashActivity splashActivity);

}

SplashPresenter.java

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注入。所以我需要解决这个问题以及如何解决?

1 个答案:

答案 0 :(得分:0)

我将这些依赖项添加到NSMutableAttributedString的构造函数中,并向其中添加SplashPresenter批注。 Dagger2支持构造函数注入,并且您需要的所有依赖项都是可以解决的(并且您也可以摆脱@Inject

SplashModule