Dagger无法提供我的依赖项

时间:2017-03-21 18:25:46

标签: java android dagger-2

我遇到了Dagger 2的问题。 我想要一个通用的NetworkModule,我可以分享我的改造等等。然后我想要子组件,以便每个流程我有不同的改造接口,例如登录,...

我现在的设置是:

@Module
public class NetworkModule {

    @Provides
    @Singleton
    @Named("Default")
    Retrofit provideRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("myUrl")
                .build();

        return retrofit;
    }
}

我还有一个ApplicationModule(我不知道这是否是使用ApplicationModule的正确方法)。

@Module
public class ApplicationModule {
    private Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return this.application;
    }
}

最后但并非最不重要的是我的组件将两者结合在一起:

@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetworkComponent {
    Retrofit provideRetrofit();
    void inject(MainActivity activity);
}

现在我没有看到问题,但是当我这样做时:

((MyApplication) getApplication()).getNetworkComponent().inject(this);

将其创建为:

DaggerNetworkComponent.builder().applicationModule(new ApplicationModule(this)).build();

我无法编译并收到错误:

retrofit2如果没有@Inject构造函数或者@ Provide-或@ Produces-annotated方法,则无法提供改进。

2 个答案:

答案 0 :(得分:2)

@Named("Default")添加到Retrofit provideRetrofit();

中的NetworkComponent

答案 1 :(得分:0)

您可以参考以下类别来了解dagger 2和改装:

<强> Injector.java

public class Injector {

// Singleton instance
private static Injector instance;

// components
private AppComponent appComponent;

// Private constructor to make it singleton
private Injector() {
}

/**
 * Get the singleton Injector instance
 *
 * @return Injector
 */
private static Injector instance() {
    if (instance == null) {
        instance = new Injector();
    }

    return  instance;
}

/**
 * Creates application component which used of injection later.
 *
 * @param application
 */
public static void createApplicationComponent(Application application) {
    if (instance().appComponent == null) {
        instance().appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(application))
                .build();
    }
}

/**
 * Returns the component for injection.
 *
 * @return
 */
public static AppComponent component() {
    return instance().appComponent;
}

}

<强> AppComponent.java

@Singleton
@Component(modules = {
    AppModule.class,
    ApiModule.class,
})
public interface AppComponent {
// Other utility classes for injection
}

ApiModule.java ,类似于您的网络模块类

@Module
public class ApiModule {

@Provides
@Singleton
public Retrofit provideApi(
        OkHttpClient client,
        Converter.Factory converterFactory,
        CallAdapter.Factory callAdapterFactory) {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Config.API_BASE_URL)
            .client(client)
            .addConverterFactory(converterFactory)
            .addCallAdapterFactory(callAdapterFactory)
            .build();

    return retrofit;
}
}

<强> AppModule.java

@Module
public class AppModule {

private Application application;

public AppModule(Application application) {
    this.application = application;
}

@Provides
@Singleton
public Application provideApplication() {
    return application;
}

@Provides
@Singleton
public Context provideContext() {
    return application;
}

}

稍后在您的活动类中,您可以使用Injector.component().inject(this);注入dagger 2依赖项

有关更多说明,请参阅this github repo