Java 如何使用Dagger 2为来自多个独立组件的父/子活动注入不同的依赖关系?
我对Dagger2比较陌生,我经常遇到Dagger2中的编译器错误,上面说缺少@Provide或@products。我要做的是在基类中注入公共组件,然后子类也有自己的组件。我在网上查看了几个例子,看到人们在使用子组件;但我还是不明白为什么我们可以为每个类都有多个独立的组件?我不明白为什么我的ImageComponent必须是ApicComponent的子组件,它只是没有任何意义。所以我想知道什么是关于这个问题的正确方法,或者有没有我不知道的替代方法?谢谢 Api组件 图像组件 活动和组件单例 堆栈跟踪Java 如何使用Dagger 2为来自多个独立组件的父/子活动注入不同的依赖关系?,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我对Dagger2比较陌生,我经常遇到Dagger2中的编译器错误,上面说缺少@Provide或@products。我要做的是在基类中注入公共组件,然后子类也有自己的组件。我在网上查看了几个例子,看到人们在使用子组件;但我还是不明白为什么我们可以为每个类都有多个独立的组件?我不明白为什么我的ImageComponent必须是ApicComponent的子组件,它只是没有任何意义。所以我想知道什么是关于这个问题的正确方法,或者有没有我不知道的替代方法?谢谢 Api组件 图像组件 活动和组件单例 堆
基类不足以作为注入目标。Dagger2依赖于强类型类,所以您必须明确指定应该定义哪些类
无法执行此操作。请使用Components.get.data.injectthis;此即BaseActivity是抽象的尝试在ImageModule中用@Provides@Bhargav:是的,我做到了。这是帖子中的一个拼写错误,让我来修正一下。谢谢。如果出现错误,请发布堆栈跟踪possible@Bhargav:已添加。谢谢。那么UserApi是一个接口?在提供的方法中,您实际上只是返回一个匿名类是吗?相反,请尝试创建一个实现这些接口的类,并返回该类的新实例,而不是返回匿名类
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);
}
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]