Dagger 2:没有为组件接口生成实现

时间:2015-10-02 11:28:38

标签: android annotations android-library dagger-2

我创建了一个演示Android Lib项目,并使用dagger 2.0执行以下步骤:

  1. 将以下jar添加到/ libs文件夹:

      

    匕首-2.0.jar

         

    匕首编译-2.0.jar

         

    匕首生产者-2.0-beta.jar

         

    番石榴18.0.jar

         

    javawriter-2.5.1.jar

         

    javax.annotation中-API-1.2.jar

         

    javax.inject-1.jar

  2. 项目 - >属性 - > Java编译器 - >注释处理(启用注释处理)

  3. 项目 - >属性 - > Java编译器 - >注释处理 - 工厂路径:添加了上述所有罐子。

  4. 创建以下类:

    public class Car {
    
        private Engine engine;
    
        @Inject
        public Car(Engine engine) {
            this.engine = engine;
        }
    
        public String carDetails(){
            String engineName = this.engine.getName();
            int engineNumber = this.engine.getNumber();
    
            return "This car has the following details: \n" + engineName + "----" + engineNumber;
        }
    }
    

    public interface Engine {

            public String getName();
    
            public int getNumber();
    
        }
    
    public class Toyota implements Engine{
    
        @Override
        public String getName() {
            return "This is toyota engine";
        }
    
        @Override
        public int getNumber() {
            return 1234567890;
        }
    
    
    
    }
    
    
    @Component(modules = EngineModule.class)
    public interface EngineComponent {
        void inject();
    }
    
    @Module
    public class EngineModule {
    
        public EngineModule(DemoApplication demoApplication) {
    
        }
    
        @Provides
        Engine provideEngine(){
            return new Toyota();
        }
    }
    
  5. 但在/.apt-generated文件夹中只有两个文件:

    Car_Factory.java            EngineModule_ProvideEngineFactory.java
    

    DaggerEngineComponent.java不适合我构建组件。

    有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我猜测注释处理器遇到错误而Eclipse没有向您显示日志。如果在“输出”视图中有日志输出,则可能需要将其粘贴到问题中。

具体来说,我认为它在void inject()上出错了,这不是@Component docs中描述的格式。这些文档描述了三种类型的方法:

  • 返回可注射类型Dagger的无参数工厂方法创建和注入,如Engine createEngine()
  • 单参数void方法,用于接收在其他位置创建的实例并应用方法和字段注入,如void injectEngine(Engine)Engine injectEngine(Engine)
  • 将组件绑定与另一个模块绑定组合的子组件返回方法。

由于您的void inject()与这些格式中的任何格式都不匹配,因此Dagger可能会错误输出并拒绝创建DaggerEngineComponent。