我刚刚开始学习dagger2,面对一个看起来像个bug的奇怪问题.这是模块:
@Module
public class SimpleModule {

    @Provides
    Cooker providerCooker() {

        return new Cooker("tom","natie");
    }
}

零件:

@Component(modules = SimpleModule.class)
public interface SimpleComponent {

    void inject(DaggerTestActivity activity);

}

接口:

public interface CoffeeMaker {

    String makeCoffee();
}

执行:

public class SimpleMaker implements CoffeeMaker {

        Cooker mCooker;

        @Inject
        public SimpleMaker(Cooker cooker) {

            this.mCooker = cooker;

        }

        @Override
        public String makeCoffee() {

            return mCooker.makeCoffee();
        }
    }

电饭煲:

public class Cooker {

    String name; 
    String coffeeKind;


    public Cooker(String name,String coffeeKind) {
        this.name = name;
        this.coffeeKind = coffeeKind;
    }

   public  String  makeCoffee() {

        return name + "make" + coffeeKind; 
    }

}

咖啡机:

public class CoffeeMachine {

    CoffeeMaker mMaker;

    @Inject
    public CoffeeMachine(CoffeeMaker coffeeMaker) {

        this.mMaker = coffeeMaker;
    }

    public String makeCoffee() {

        return mMaker.makeCoffee();
    }
}

只是它.我在活动中使用.这里面临奇怪的问题:

@Inject
    CoffeeMachine mCoffeeMachine;

我从Dagger 2编译器得到的错误如下:

Error:(14,10) com.wyyc.daggertest.CoffeeMaker cannot be provided without an @Provides-annotated method.
com.wyyc.zqqworkproject.DaggerTestActivity.mCoffeeMachine
[injected field of type: com.wyyc.daggertest.CoffeeMachine mCoffeeMachine]
com.wyyc.daggertest.CoffeeMachine.<init>(com.wyyc.daggertest.CoffeeMaker coffeeMaker)

所有这些情况看起来都很奇怪,我想听听更有经验的Dagger 2用户的一些意见.

解决方法

您的CoffeeMachine需要CoffeeMaker.并且您已声明Dagger将通过使用@Inject注释构造函数来处理向CoffeeMachine提供依赖性.但达格说:

CoffeeMaker cannot be provided without an @Provides-annotated method

因为您没有在任何地方指定应如何创建CoffeeMaker对象. @Injecting SimpleMaker是不够的,因为SimpleMaker!= CoffeeMaker.因此,你必须明确指出,当Dagger想要CoffeeMaker时,然后向他提供SimpleMaker.

将您的模块更改为:

@Module
public class SimpleModule {

    @Provides
    Cooker providerCooker() {
        return new Cooker("tom","natie");
    }

    @Provides
    CoffeeMaker provideCoffeeMaker(Cooker cooker) {
        return new SimpleMaker(cooker);
    }

}

java – Dagger 2:如果没有@ Provide-annotated方法,则无法提供的更多相关文章

  1. android – Dagger2:组件不能依赖于多个范围的组件

    是的,我知道以前曾经问过,是的,我知道这是“按设计”.但是我想做这样的事情:但是,我得到的是无范围,每次我注入JobManager或ScheduleRepository或其他任何东西,我得到一个新的实例.唯一可以“修复”的方法就是这个.不是粉丝.那么,如何构建和拆分依赖树,而不是制作一个巨大的巨型blob组件,其中列出了每个单独的模块和每个单独的提供方法?

  2. android – Kotlin和Dagger2

    我正在尝试将Kotlin添加到我的项目中,但在启用Kotlin之后我无法构建,因为Dagger2类不再生成.我尝试了第二个项目,我有同样的问题.这些是我为启用Kotlin所做的改变:项目build.gradle:Appbuild.gradle:错误发生在这里:其中不再定义DaggerObjectGraph.任何帮助将不胜感激.解决方法只需删除

  3. android – Dagger2 – 生成的组件类中的“未使用”模块

    我的Dagger2Component类包含3个模块,我试图用它们将字段依赖项注入到AndroidActivity类中.生成的Component文件包含所有模块未使用的注释,链接此page以获取更多信息.我的Activity类正在调用Component的inject方法,并且模块提供了注释用于注入的字段,因此我不确定为什么生成的Component文件没有任何Providers来执行此注入.我的代码如下,感谢您的帮助!申请类别:活动类:解决方法问题1:为什么我的模块被标记为“未使用”?您还没有提供正确的注射部

  4. annotationProcessor androidTest dagger2

    对于检测测试,我有一个TestApplication创建一个TestComponent,但不再生成该文件(错误:/xxx/TestApplication.java:16:无法解析import.xxx.DaggerTestApplicationComponent).我无法确定根本原因.我尝试了不同的AndroidStudio(2.2,2.1.2),不同的gradle插件(2.2.0-alpha6,5

  5. android – 如果没有@ Provide-annotated方法,则无法提供上下文,但它是?

    解决方法经过一段时间的尝试和错误,我似乎发现了原因,这是Context的含糊之处,因为在需要Context的某些地方,缺少@ForApplication.此外,这可能是我对Dagger2的虚弱的理解,但是这个样板很容易出现开发者的错误.无论如何…对于发现问题的任何人,您只需要在使用依赖关系的每个地方添加限定符注释:

  6. android – MVVM Dagger2与组件中存在匹配键的绑定

    我正在使用以下谷歌示例项目:https://github.com/googlesamples/android-architecture-components作为我的新项目的参考,并且难以尝试向项目添加第二个活动.这是编译时遇到的错误这是我的代码ActivityModuleAppComponentAppInjector的AppModuleFragmentBuildersModule注射viewmod

  7. android – 在使用Dagger2时创建测试依赖项

    解决方法目前,Dagger2没有一些解决方法是不可能的.你可以阅读它here.我提出了oneworkaround,但这需要更改生产代码.简而言之:>为@Component提供额外的设置器>测试组件必须扩展生产组件有关更多信息,请检查两个链接.希望这个问题将在未来版本的匕首2中得到解决.

  8. Dagger2 dagger.android.*类不存在

    我在instructionsfromtheofficialdocs之后将Dagger2添加到我的Android应用程序中.我之前使用过Dagger和Dagger2,似乎Google已经修改了Android的实现,如下所示:Theclassesindagger.androidofferoneapproachtosimplifythispattern.…Next,makeyourApplication

  9. java – Dagger 2:如果没有@ Provide-annotated方法,则无法提供

    =CoffeeMaker.因此,你必须明确指出,当Dagger想要CoffeeMaker时,然后向他提供SimpleMaker.将您的模块更改为:

  10. java – 匕首2麻烦@注入FirebaseMessagingService

    我最近试图将我正在从GCM工作的应用程序迁移到FCM.在这样做的时候,我发现我以前在Dagger2(2.0.2)中提供了我的RetrofitAPI和服务中的其他用户数据管理器的实例(没有问题),所以我不能再这样做了FirebaseMessagingService.每当我尝试用我的Dagger2Component界面中列出的FirebaseMessagingService子类编译时,我会得到一个Il

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部