Dagger2组件(非作用域)不能依赖于作用域组件 - 错误

14

我正在尝试编译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();
  }
2个回答

16

您需要为ApplicationComponent提供作用域。这不一定必须是 @Singleton,因为 Dagger 2 允许您使用 @Qualifier 注解在接口上定义自己的作用域。

@Scope
public @interface CustomScopeName {
}

您可以像这样使用它:

@CustomScopeName
@Component(dependencies = ApplicationComponent.class,
   modules = {
           MainActivityModule.class,
           AModule.class,
           BModule.class
   }) .......

我认为不允许在非封闭组件中使用封闭依赖的原因是为了防止单例对象依赖非单例对象以及防止循环依赖。


3
在Dagger 2.0的开发过程中,组件的作用范围变得更加严格了。请参见这个讨论。因为我的示例项目依赖于Dagger 2.0的SNAPSHOT版本,所以它出现了问题。
正如atamakosi所说,并且在这里也很好地解释了,你需要将自定义作用域添加到ActivityComponent,例如@PerActivity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接