I have 2 modules: AndroidModule
for providing Context
-related objects and PhotosModule
providing PhotoManager
.
I want to use PhotoManager
in PhotosFragment
. PhotoManager
depends on DbManager
, which is provided by AndroidModule
.
How do I connect all the dots?
The code compiles, but a NPE is thrown on this line:
mDbManager.readDatabase();
meaning that the injection of DbManager
into PhotoManager
did not occur, even though I set the
injects = PhotoManager.class
in AndroidModule
.
Also, mDbManager
is not a private field, so I don't think I have to use injection on PhotoManager
's constructor; field injection should be sufficient.
What's the reason and how do I satisfy the missing dependency? I assume there may be more than one problem with my code. Note: I just started with Dagger, please keep that in mind.
Application:
public class TestApp extends Application {
private ObjectGraph mObjectGraph;
@Override
public void onCreate() {
super.onCreate();
mObjectGraph = ObjectGraph.create(getModules().toArray());
}
protected List<Object> getModules() {
return Arrays.asList(new AndroidModule(this), new PhotosModule());
}
public void inject(Object object) {
mObjectGraph.inject(object);
}
}
AndroidModule:
@Module(library = true, injects = PhotoManager.class)
public class AndroidModule {
private final TestApp mApplication;
public AndroidModule(TestApp application) {
mApplication = application;
}
@Provides
@Singleton
@ForApplication
Context provideApplicationContext() {
return mApplication;
}
@Provides
@Singleton
DbManager provideDbManager() {
return new DbManager(mApplication);
}
}
PhotosModule:
@Module(injects = PhotosFragment.class)
public class PhotosModule {
@Provides
@Singleton
PhotoManager providePhotoManager() {
return new PhotoManager();
}
}
PhotoManager:
@Singleton
public class PhotoManager {
@Inject
DbManager mDbManager;
public void doSomething() {
mDbManager.readDatabase();
}
}
PhotosFragment:
public class PhotosFragment extends Fragment {
@Inject
PhotoManager mPhotoManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((TestApp) getActivity().getApplication()).inject(this);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
///...
mPhotoManager.doSomething();
}
}
DbManager:
@Singleton
public class DbManager {
public DbManager(Context context) {
//...
}
public void readDatabase() {
//...
}
}