2016-05-28 55 views
4

我需要从ApplicationModule公开我的OkHttpClient,所以我添加到ApplicationComponent。事情是这样的:Dagger ApplicationComponent必须设置

@Module 
public class ApplicationModule { 

    @Provides @Singleton 
    public OkHttpClient provideOkHttpClient() { 
    final OkHttpClient.Builder client = new OkHttpClient.Builder(); 

    return client.build(); 
} 



@Singleton 
@Component(modules = {ApplicationModule.class}) 
public interface ApplicationComponent { 

    OkHttpClient okHttpClient(); 

} 

所以我在ApplicationComponent添加OkHttpClient okHttpClient();,你可以看到正上方。

现在在我的NetworkModule我用它喜欢:

@Module 
public class NetworkModule { 

    @Provides @ActivityScope 
    public ProjectService provideProjectService(OkHttpClient client) { 
      return new ProjectService(client); 
} 


    @Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class}) 
@ActivityScope 
public interface NetworkComponent { 

     void inject(@NonNull MyActivity myActivity); 

} 

但现在,当我得到一个运行时错误:

Caused by: java.lang.IllegalStateException: css.test.demo.ApplicationComponent must be set 
    at css.test.demo.main.projects.network.DaggerNetworkComponent$Builder.build(DaggerNetworkComponent.java:102) 
    at css.test.demo.main.projects.MyActivity.onCreate(MyActivity.java:159) 
    at android.app.Activity.performCreate(Activity.java:6237) 

,这里是我是如何建造起来MyActivity:

NetworkComponent = DaggerNetworkComponent.builder() 
    .NetworkModule(new NetworkModule(this)) 
    .build(); 

NetworkComponent.inject(this); 

回答

15

我喜欢强调匕首不含魔术—它只是纯色java的。如果你没有提供它所需要的信息,编译器会抱怨。

如果你看看你的DaggerNetworkComponent.Builder,你会注意到它有一个叫做appComponent(AppComponent component)的方法。这是匕首期望你添加你的NetworkComponent所依赖的appcomponent的地方。

NetworkComponent = DaggerNetworkComponent.builder() 
     .NetworkModule(new NetworkModule(this)) 
     .appComponent(((App)getApplication()).getAppComponent()) // add your appComponent 
     .build(); 

它应该工作。

+0

如果我不希望一些类的应用程序模块例如在一个类中完全依赖,那我该如何在网络模块中包含applicationModule,但其他类只需要网络模块来完成依赖关系。请帮忙。 –

+0

@eCDroid如果网络模块依赖于应用程序模块,而其他模块依赖于网络模块,那么这个其他模块也取决于应用程序模块,但您总是可以拆分/重构模块或创建新模块。 –

相关问题