Java 如何使用Dagger 2为来自多个独立组件的父/子活动注入不同的依赖关系?

Java 如何使用Dagger 2为来自多个独立组件的父/子活动注入不同的依赖关系?,java,android,dependency-injection,dagger-2,Java,Android,Dependency Injection,Dagger 2,我对Dagger2比较陌生,我经常遇到Dagger2中的编译器错误,上面说缺少@Provide或@products。我要做的是在基类中注入公共组件,然后子类也有自己的组件。我在网上查看了几个例子,看到人们在使用子组件;但我还是不明白为什么我们可以为每个类都有多个独立的组件?我不明白为什么我的ImageComponent必须是ApicComponent的子组件,它只是没有任何意义。所以我想知道什么是关于这个问题的正确方法,或者有没有我不知道的替代方法?谢谢 Api组件 图像组件 活动和组件单例 堆

我对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]