私のプロジェクトでdagger2を実装しようとしていますが、 "android .app.Applicationは@Injectコンストラクタなしで、または@ Provides-annotatedメソッド "から提供することはできません。dagger2エラー "android.app.Applicationは@Injectコンストラクタなしで提供することも、@ Provides-annotatedメソッドから提供することもできません"
ここに私のコードです:
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<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().create(this);
}
}
ディ/ 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);
}
ディ/ 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<App> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<App> {}
}
ジ/ 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);
}
}
ジ/ 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;
}
}
ありがとうございます。
私はコンポーネントビルダーであなたの 'Application'をバインドすることも、モジュールビルダーにそれを追加することもしません。 ( ' **ジ/ AppComponent.java ** 'アプリケーションgetApplication; **ジ/ AppModule.java ** '@Binds @SingletonアプリケーションbindApplication(アプリケーションのアプリケーション): –
私は次のように追加しようとしました); ' 依存サイクルエラーが発生しました。 –
@DanielGorgan '@Binds Application bindApplication(App app);で試して、' App'というカスタム実装に一般的な 'Application'オブジェクトをバインドするようにしてください。あなたは '@ Singleton'を取ったり出たりすることができますが、私はそれを残しておきます。 –