两个组件的依赖性合二为一 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 中都注入了我的东西。
但后来我意识到 RestApi
和 SocketApi
也是 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
- 我做错了吗?什么是组织 components/modules 的最佳方式,以便能够将一个组件重用到已经包含另一个模块的 activity 中
- 我可以通过向我的 api 类 添加并清空用 @Inject 注释的 public 构造函数来修复错误,但是这样做我发现我的所有字段都将被注入
SecondActivity
不管调用 inject
方法的组件是什么,这样做是否正确。
啊...我分担你的痛苦。
您不能将两个组件注入同一个 Activity。至少我找不到方法! :)
这对我来说也是合乎逻辑的尝试,而且我遇到了同样的问题。
您可以通过两种方法解决它:
- 所有注入都使用一个大组件(我真的反对)
- 为每个 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);
}
我发现第二个是最干净的解决方案。
如果有人有其他建议,我准备试试!
我正在研究 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 中都注入了我的东西。
但后来我意识到 RestApi
和 SocketApi
也是 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
- 我做错了吗?什么是组织 components/modules 的最佳方式,以便能够将一个组件重用到已经包含另一个模块的 activity 中
- 我可以通过向我的 api 类 添加并清空用 @Inject 注释的 public 构造函数来修复错误,但是这样做我发现我的所有字段都将被注入
SecondActivity
不管调用inject
方法的组件是什么,这样做是否正确。
啊...我分担你的痛苦。 您不能将两个组件注入同一个 Activity。至少我找不到方法! :)
这对我来说也是合乎逻辑的尝试,而且我遇到了同样的问题。
您可以通过两种方法解决它:
- 所有注入都使用一个大组件(我真的反对)
- 为每个 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);
}
我发现第二个是最干净的解决方案。
如果有人有其他建议,我准备试试!