1

First time using Dagger2.

In my android application I have a MyApplication class that extends Application. I also have an ImageAssistant class that is a collection of related image-processing methods. In my MyApplicaiton class I used to instantiate an ImageAssistant for all the activities to use.

Now I am trying to make it work with Dagger2, but I dont know how to pass a context in the module that provides ImageAssistant

This is how my code looked:

public class ImageAssistant {

    Context context;

    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    public ImageAssistant imageAssistant;

    public void onCreate() {

        imageAssistant = new ImageAssistant(this);
    }

}

Now, enter Dagger 2, here is what I have

public class ImageAssistant {

    Context context;

    @Inject
    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    @Inject
    public ImageAssistant imageAssistant;

    public void onCreate() {


    }

}

in package .modules:

AppModule.java


@Module
public class AppModule {

    @Provides
    ImageAssistant provideImageAssistant() {
        return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
    }

}

EDIT: This is how my module looks now, but I still dont know how to tie everything together:

@Module
public class AppModule {

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    Context provideApplicationContext() {
        return this.application;
    }

    @Provides
    ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
        return imageAssistant;
    }

}

And this is the AppComponent:

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {

    ImageAssistant provideImageAssistant();
    Context context();

}
4

2 回答 2

1

Your module should look like this:

@Module(injects = {MainActivity.class})
public class AppModule {

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    public ImageAssistant provideImageAssistant() {
        return new ImageAssistantImpl(application); // implementation of ImageAssistant
    }

}

Usage in Activity:

public class MainActivity extends Activity{

@Inject
ImageAssistant imageAssistant;

@Override
protected void onCreate(Bundle savedInstanceState) {
    SharedObjectGraph.inject(this);
    imageAssistant.doSomething();
}

}

Don't forget to init the ObjectGraph in Application class. I use SharedObjectGraph static class to share ObjectGraph created from AppModule across the whole app.

Read building the graph section.

于 2015-06-03T09:48:53.227 回答
1

I did something like this:

@Module
public class ApplicationModule {

    private final SpendApplication app;

    public ApplicationModule(SpendApplication app) {
        this.app = app;
    }

    @Provides
    @Singleton
    public Context providesContext() {
        return app;
    }

}

and:

@Module
public class GattManagerModule {

    @Provides
    @Singleton
    GattManager providesGattManager(Context context) {
        return new GattManager(context);
    }
}

And declare all places where it's used:

@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
    void inject(MainScreenActivity activity);
    ...
}

In my app application class:

@Override
public void onCreate() {
    super.onCreate();

    component = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();

}

And in my MainActivity:

@Inject
GattManager gattManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getAppComponent().inject(this);
}
于 2017-04-17T09:04:42.350 回答