有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Dagger无法提供我的依赖项

我的匕首2有问题。 我想要一个通用的网络模块,在那里我可以分享我的改造,等等。。然后,稍后我需要子组件,以便每个流都有不同的改型接口,例如登录

我现在的设置是:

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

我无法编译,我得到错误:

改造2。如果没有@Inject构造函数或@Provides-或@products注释方法,则无法提供改装


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    关于dagger 2和改装的使用,您可以参考以下课程:

    注射器。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
    }
    

    api模块。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依赖项

    有关更多说明,请参阅thisgithub repo