gpt4 book ai didi

java - 如何使用 Dagger 2 为来自多个独立组件的父/子 Activity 注入(inject)不同的依赖项?

转载 作者:搜寻专家 更新时间:2023-11-01 07:50:11 26 4
gpt4 key购买 nike

我是 Dagger 2 的新手,我一直遇到 Dagger 2 的编译器错误,提示缺少 @Provide@Produces。我想做的是在基类中注入(inject)公共(public)组件,然后子类也有自己的组件。我在网上查了几个例子,看到有人在使用子组件;但我仍然不明白为什么每个类只能有多个独立的组件?我不明白为什么我的 ImageComponent 必须是 ApiComponent 的子组件,这没有任何意义。所以我想知道关于这个问题的正确方法是什么,或者是否有任何我不知道的替代方法?谢谢。

API 组件

public interface UserApi {

int getUser();
}

public interface SearchApi {

int search();
}

@Singleton
@Module
public class ApiModule {

public ApiModule() {
}

@Singleton
@Provides
public SearchApi provideSearchApi() {
return new SearchApi() {
@Override
public int search() {
return 0;
}
};
}

@Singleton
@Provides
public UserApi provideUserApi() {
return new UserApi() {
@Override
public int getUser() {
return 0;
}
};
}
}

@Singleton
@Component(modules = {
ApiModule.class
})
public interface ApiComponent {

void inject(BaseActivity activity);
}

图像组件

public interface ImageLoader {

boolean load(String url);
}

@ActivityScope
@Module
public class ImageModule {

@ActivityScope
@Provides
public ImageLoader provideImageResource() {
return new ImageLoader() {
@Override
public boolean load(String url) {
return false;
}
};
}
}

@ActivityScope
@Component(
modules = {
ImageModule.class
}
)
public interface ImageComponent {
// Dagger doesn't allow this? Not sure why?
void inject(MainActivity activity);
}

Activity 和组件单例

public class Components {

private ApiComponent apiComponent;

private ImageComponent imageComponent;

private static Components singleton;

public static void initialize(Context context) {
if (singleton != null) {
throw new RuntimeException("Attempted to initialize components twice");
}
singleton = new Components(context);
}

public static Components get() {
return singleton;
}

private Components(Context context) {
apiComponent = ApiComponent
.builder()
.dataModule(new ApiModule())
.build();

// Can't generate image component yet
}

public ApiComponent api() {
return apiComponent;
}

public ImageComponent image() {
return imageComponent;
}
}
public abstract class BaseActivity extends AppCompatActivity {

@Inject
protected UserApi userApi;

@Inject
protected SearchApi searchApi;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Components.get().data().inject(this);
}
}

public class MainActivity extends BaseActivity {

@Inject
protected ImageLoader imageLoader;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

堆栈跟踪

Error:(15, 10) error: android.com.dagger.data.UserApi cannot be provided without an @Provides- or @Produces-annotated method.
android.com.dagger.BaseActivity.userApi
[injected field of type: android.com.dagger.data.UserApi userApi]

最佳答案

基类不足以作为注入(inject)目标。 Dagger 2 依赖于强类型类,因此您必须明确指定应该定义哪些类

你不能这样做 Components.get().data().inject(this); this(即 BaseActivity 是摘要)

关于java - 如何使用 Dagger 2 为来自多个独立组件的父/子 Activity 注入(inject)不同的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35836030/

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