DaggerIntegration - WonderCsabo/androidannotations GitHub Wiki
Integrating Dagger and AndroidAnnotations
Dagger and AndroidAnnotations can easily work together, combined usage of both frameworks is described here. This guide uses Dagger 1
; for Dagger 2
, see this guide. The article assumes that the reader is familiar with Dagger 1
usage of normal Android projects. If not, the Dagger documentation and example projects should be read first.
Injecting into @EActivity
If you would like to inject Dagger
dependencies into an @EActivity annotated Activity
, you need to add following modifications:
First, you have to call the injector to inject the dependencies by calling ObjectGraph.inject()
:
@EActivity
public class DaggerActivity extends Activity {
@AfterInject
void onInjectDependencies() {
((MyApplication) getApplication()).component().inject(this);
}
@Inject
DaggerDependency dependency;
}
This step is also required in non-AA Dagger
projects. You can add this injection code to a common parent class, to avoid code duplication.
Second, you have to use the AA generated classes in your modules. This step is where AA and normal Dagger usage really differs.
@Module(
injects = {
DaggerActivity_.class, // note the underscore
...
}
)
public class DaggerModule {
}
Injecting into @EFragment
Usage of @EFragment annotated @Fragment
with Dagger is very similar to @EActivity
.
First, you have to call the injector to inject the dependencies by calling ObjectGraph.inject()
:
@EFragment
public class DaggerFragment extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
ObjectGraph objectGraph = ...; // obtain the graph as usual
objectGraph.inject(this);
}
@Inject
DaggerDependency dependency;
}
Second, you have to use the AA generated classes in your modules.
@Module(
injects = {
DaggerFragment_.class, // note the underscore
...
}
)
public class DaggerModule {
}
Injecting into @EBean
If you want to inject Dagger
dependencies into @EBean annotated AA beans, you have to follow these steps:
First, you have to call the injector to inject the dependencies by calling ObjectGraph.inject()
:
@EBean
public class DaggerBean {
public DaggerBean() {
ObjectGraph objectGraph = ...; // obtain the graph as usual
objectGraph.inject(this);
}
@Inject
DaggerDependency dependency;
}
Second, you have to use the AA generated classes in your modules.
@Module(
injects = {
DaggerBean_.class, // note the underscore
...
}
)
public class DaggerModule {
}
Injecting into other components
Injecting into other components like @EView or @EService follows the same pattern which was described here. You have to call the injector in the constructor / creation lifecycle method, and add the generated class instead of the annotated class in the @Module
's inject
parameter array.
Providing @EBean
If you want to use Dagger
to inject an instance of an AA enhanced class, like @EBean, you have to add a @Provides
method in your module. In that method, you have to create an instance of the generated class, by calling the generated methods manually.
@EBean
public class SomeDependency {
// ...
}
@Module(library = true, complete = false)
public class DaggerModule {
@Provides
SomeDependency provideSomeDependency(Context context) {
return SomeDependency_.getInstance_(context);
}
}
You have to also provide an Android Context
object, as usual in Dagger
Android projects. After this is done, you can inject the @EBean
with Dagger
to another class:
public class DaggerClass {
@Inject
SomeDependency someDependency; // will have an instance of SomeDependency_
}