gpt4 book ai didi

android - 一个 Activity 中两个组件的依赖关系

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:30:32 25 4
gpt4 key购买 nike

我正在研究 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 。

进入第一个 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 中都注入(inject)了我的东西。但后来我意识到 RestApiSocketApi 也是 SecondActity 所必需的,所以我尝试将它们注入(inject) 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);
//...
}
}

在这些修改编译我的项目后,我有以下错误

错误:(15, 10) 错误:如果没有 @Inject 构造函数或来自 @Provides- 或 @Produces- 注释方法,则无法提供 com.example.guillaume.testdagger.RestApi。 com.example.guillaume.testdagger.SecondActivity.restApi [注入(inject)字段类型:com.example.guillaume.testdagger.RestApi restApi]

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

所以我的问题是:

  • 这个错误从何而来?
  • 如何使用多个组件将字段注入(inject)到一个 Activity 中
  • 我做错了吗?什么是组织组件/模块的最佳方式,以便能够将一个组件重用到已经包含另一个模块的 Activity 中
  • 我可以通过向我的 api 类添加和清空用 @Inject 注释的公共(public)构造函数来修复错误,但是这样做我发现我的所有字段都将被注入(inject)到 SecondActivity 中,而不管用于调用 inject 方法,这样做是否正确。

最佳答案

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

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

你可以用两种方法解决它:

  1. 对所有注入(inject)使用一个大组件(我真的反对)
  2. 为每个你想注入(inject)东西的 Activity/地方创建一个组件

所以,而不是

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

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

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

关于android - 一个 Activity 中两个组件的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36352796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com