dagger2错误“如果没有@Inject构造函数或@ Provide-annotated方法,则无法提供android.app.Application”
我正在尝试在我的项目中实现dagger2,但是我遇到了一个错误“ 没有@Inject构造函数或者@Project-annotated方法,就无法提供android.app.Application ”。
这是我的代码:
App.java
package com.poppmedia.wallpaperautomaton; import android.app.Application; import com.poppmedia.wallpaperautomaton.di.DaggerAppComponent; import dagger.android.AndroidInjector; import dagger.android.DaggerApplication; /** * The Android {@link Application}. */ public class App extends DaggerApplication { @Override protected AndroidInjector applicationInjector() { return DaggerAppComponent.builder().create(this); } }
DI / AppModule.java
package com.poppmedia.wallpaperautomaton.di; import android.app.Application; import android.content.Context; import javax.inject.Singleton; import dagger.Binds; import dagger.Module; /** * Provider application-wide dependencies. */ @Module public interface AppModule { @Binds @Singleton Context bindContext(Application application); }
DI / AppComponent.java
package com.poppmedia.wallpaperautomaton.di; import com.poppmedia.wallpaperautomaton.App; import javax.inject.Singleton; import dagger.Component; import dagger.android.AndroidInjector; import dagger.android.support.AndroidSupportInjectionModule; /** * Injects application dependencies. */ @Singleton @Component(modules = { AndroidSupportInjectionModule.class, AppModule.class, }) public interface AppComponent extends AndroidInjector { @Component.Builder abstract class Builder extends AndroidInjector.Builder {} }
DI / TestClassModule.java
package com.poppmedia.wallpaperautomaton.di; import android.content.Context; import com.poppmedia.wallpaperautomaton.TestClass; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; @Module public class TestClassModule { @Provides @Singleton TestClass provideTestClass(Context context) { return new TestClass(context); } }
DI / TestClassComponent.java
package com.poppmedia.wallpaperautomaton.di; import com.poppmedia.wallpaperautomaton.TestClass; import javax.inject.Singleton; import dagger.Component; @Singleton @Component(modules = { AppModule.class, TestClassModule.class }) public interface TestClassComponent { TestClass getTestClass(); }
TestClass.java
package com.poppmedia.wallpaperautomaton; import android.content.Context; import javax.inject.Inject; import javax.inject.Singleton; @Singleton public class TestClass { private Context mContext; @Inject public TestClass(Context context) { mContext = context; } }
谢谢。
在您的具体情况下,您错过了:
@Binds Application bindApplication(App app);
这很重要,因为dagger.android会自动包含对特定Application,Activity,Fragment,Service,BroadcastReceiver等子类的绑定,但不包括一般对象 。 (您可以注入App而不是Application ,而不是YourActivity而不是Activity 。)如果您想向dagger.android表明它应该使用您的App实例满足Application的请求,您必须包含如上所述的绑定。
一般来说,对于Application,Activity,Service和BroadcastReceiver来说,这是非常安全的事情,但不是Fragment(本机或compat库); 这是因为dagger.android尊重嵌套的片段,在这种情况下,片段注入将是不明确的。
虽然您可以通过模块和实例字段提供应用程序,如luffy的答案 ,这比您需要的更多样板,并且也不太优化:Dagger将编写代码来调用您的@Provides
方法,而您可以声明性地告诉Dagger重用使用@Binds
的现有绑定或编写static @Provides
方法,以避免在实例上调用调用。
查看@Binds
的Dagger优势和静态调度的Android优势 。
在AppModule中,@绑定应用程序,但任何其他模块都不提供应用程序。
由于Application是由Android框架创建的,因此您应该让AppModule从外部提供Application。
@Module public class AppModule { private Application mApp; public AppModule(Application app) { mApp = app } @Singleton Context provideContext() { return mApp } }