Dagger 无法提供我的依赖项

Dagger can not provide my dependencies

我在使用 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.Retrofit 无法在没有 @Inject 构造函数或 @Provides- 或 @Produces- 注释方法的情况下提供。

@Named("Default") 添加到 NetworkComponent

中的 Retrofit provideRetrofit();

匕首2的用法和改造可以参考以下class:

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 类似于你的网络模块 class

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

}

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

有关更多说明,您可以参考 this github repo