Dagger应用组件必须设置。

9

我需要从ApplicationModule暴露我的OkHttpClient,因此我添加到了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);
1个回答

18

我想强调的是,Dagger并不包含任何魔法——它只是普通的Java。如果你没有提供它所需的信息,编译器就会报错。

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

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

它应该能够正常工作。


如果我不想为某些类使用应用程序模块,例如在一个类中将完全依赖项包含在应用程序模块中,但其他类只需要网络模块来满足依赖关系。请帮忙。 - eC Droid
如果网络模块依赖于应用程序模块,而其他一些模块依赖于网络模块,则这些其他模块也依赖于应用程序模块,但您始终可以拆分/重构您的模块或创建新的模块。 - David Medenjak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接