我正在尝试编译https://github.com/svenjacobs/android-dagger2-example 但我遇到了与未作用域组件相关的错误,具体取决于作用域组件。 (Android Studio 1.1,Gradle 2.2.1)。此外,如果有人知道其他Dagger2 Android示例片段,我想了解它们。
更新:这是另一个非常基本的片段示例: https://github.com/gk5885/dagger-android-sample
/Users/Mac1/android-dagger2-example-master/app/src/main/java/com/svenjacobs/dagger2/ActivityComponent.java
Error:(15, 1) error: com.svenjacobs.dagger2.ActivityComponent (unscoped) cannot depend on scoped components:
@Singleton com.svenjacobs.dagger2.ApplicationComponent
Error:Execution failed for task ':app:compileDebugJava'.
> Compilation failed; see the compiler error output for details.
这是文件ActivityComponent,显然没有作用域:
import dagger.Component;
/**
* Component for all activities.
*
* @author Sven Jacobs
*/
@Component(dependencies = ApplicationComponent.class,
modules = {
MainActivityModule.class,
AModule.class,
BModule.class
})
interface ActivityComponent extends AFragment.Injector, BFragment.Injector {
void inject(MainActivity activity);
void inject(AnotherActivity activity);
}
这是范围内的组件:
package com.svenjacobs.dagger2;
import javax.inject.Singleton;
import dagger.Component;
/**
* Application-wide dependencies.
*
* @author Sven Jacobs
*/
@Singleton
@Component(modules = ApplicationModule.class)
interface ApplicationComponent {
void inject(Dagger2Application application);
/**
* Provides dependency for sub-components
*/
SomeApplicationDependency someApplicationDependency();
}
答案 0 :(得分:14)
您需要为ApplicationComponent提供范围。这不一定是@Singleton,因为Dagger 2允许您使用界面上的@Qualifier注释定义自己的范围。
@Scope
public @interface CustomScopeName {
}
然后您可以这样使用它:
@CustomScopeName
@Component(dependencies = ApplicationComponent.class,
modules = {
MainActivityModule.class,
AModule.class,
BModule.class
}) .......
我认为不允许在未作用域组件中使用作用域依赖项的原因是为了防止Singletons依赖非Singleton对象并防止循环依赖。
答案 1 :(得分:3)
在Dagger 2.0开发过程中的某个时候,行为发生了变化,组件的范围变得更加严格。见this discussion。因为我的示例项目依赖于Dagger 2.0的SNAPSHOT版本,所以它破了。
正如atamakosi说的那样,here也很好解释,你需要在ActivityComponent
添加自定义范围,例如@PerActivity
。