两个组件的依赖性合二为一 activity

Dependencies from two components in one activity

我正在研究 Dagger-2 以了解如何将它集成到我们现有的应用程序中,但我遇到了一些我无法理解或做错的事情。

我的情况:

3 API 没有任何带注释的构造函数(每个都在自己的文件中)

public class DbApi {
   public void doSomething(String username, String password) {
   }
}

public class RestApi {
    public void doSomething(String username, String password) {
    }
}

public class SocketApi {
    public void doSomething(String username, String password) {
    }
}

3 个模块(每个模块都有自己的文件)

@Module
public class DbModule {
    @Provides
    @Singleton
    public DbApi getDbApi(){
        return new DbApi();
    }
}

@Module
public class RestModule {
    @Provides
    @Singleton
    public RestApi getRestApi(){
        return new RestApi();
    }
}

@Module
public class SocketModule {
    @Provides
    @Singleton
    public SocketApi getSocketApi(){
        return new SocketApi();
    }
}

2 个组件(每个组件在其自己的文件中)

@Singleton
@Component(modules = {DbModule.class})
public interface DbComponent {
   void inject(SecondActivity activity);
}

@Singleton
@Component(modules = {RestModule.class, SocketModule.class})
public interface NetComponent {
   void inject(MainActivity activity);
}

我将这两个组件初始化到我的应用程序中

public class MyApplication extends Application {

DbComponent dBComponent;
NetComponent netComponent;

@Override
public void onCreate() {
    super.onCreate();
    dBComponent = DaggerDbComponent.builder().build();
    netComponent = DaggerNetComponent.builder().build();
}

public NetComponent getNetComponent() {
    return netComponent;
}

public DbComponent getdBComponent() {
    return dBComponent;
}
}

定义了所有这些后,我将 NetComponent 用作一个 activity,将 DbCompoment 用作第二个。

进入第一activity

public class MainActivity extends AppCompatActivity {

@Inject RestApi restApi;
@Inject SocketApi socketApi;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    ((MyApplication) getApplication()).getNetComponent().inject(this);
    //...
}
}

又进入第二个

public class SecondActivity extends AppCompatActivity {

@Inject DbApi dbApi;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    ((MyApplication) getApplication()).getdBComponent().inject(this);
    //...
}
}

到目前为止一切正常,我在每个 activity 中都注入了我的东西。 但后来我意识到 RestApiSocketApi 也是 SecondActity 所必需的,所以我试图将它们注入 activity 并且在这里我有疑问和问题。

我修改我的 NetComponent 以添加以下行

void inject(SecondActivity activity);

然后我修改我的 SecondActivity

public class SecondActivity extends AppCompatActivity {

@Inject DbApi dbApi;
@Inject RestApi restApi;
@Inject SocketApi socketApi;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...
    ((MyApplication) getApplication()).getdBComponent().inject(this);
    ((MyApplication) getApplication()).getNetComponent().inject(this);
    //...
}
}

经过这些修改编译我的项目后出现以下错误

Error:(15, 10) error: com.example.guillaume.testdagger.RestApi 不能在没有 @Inject 构造函数或 @Provides- 或 @Produces- 注释方法的情况下提供。 com.example.guillaume.testdagger.SecondActivity.restApi [注入字段类型:com.example.guillaume.testdagger.RestApi restApi]

Error:(16, 10) 错误:com.example.guillaume.testdagger.DbApi 无法在没有 @Inject 构造函数或 @Provides- 或 @Produces- 注释方法的情况下提供。 com.example.guillaume.testdagger.SecondActivity.dbApi [注入字段类型:com.example.guillaume.testdagger.DbApi dbApi]

所以我的问题是:

啊...我分担你的痛苦。 您不能将两个组件注入同一个 Activity。至少我找不到方法! :)

这对我来说也是合乎逻辑的尝试,而且我遇到了同样的问题。

您可以通过两种方法解决它:

  1. 所有注入都使用一个大组件(我真的反对)
  2. 为每个 Activity/place 要注入的东西创建一个组件

所以,而不是

@Singleton
@Component(modules = {RestModule.class, SocketModule.class})
public interface NetComponent {
   void inject(MainActivity activity);
}

试试

@Singleton
@Component(modules = {RestModule.class, SocketModule.class, DbModule.class})
public interface SecondActivityComponent {
   void inject(SecondActivity activity);
}

我发现第二个是最干净的解决方案。

如果有人有其他建议,我准备试试!