How to redefine dependencies within areas in dagger 2

How can you redefine dependencies in different areas of Dagger 2? Example:

I have two components in my application: ApplicationComponentand ActivityComponent. ApplicationComponentis the base component, and ActivityComponentis the scope where I want to override.

In this example, I created these models:

public class Parrot {

    private final HelloPrinter helloPrinter;

    public Parrot(HelloPrinter helloPrinter) {
        this.helloPrinter = helloPrinter;
    }

    public void sayHello(){
        helloPrinter.print();
    }
}


public interface HelloPrinter {
    void print();
}


public class AppHelloPrinter implements HelloPrinter{

    @Override
    public void print() {
        System.out.println("Hello Application");
    }
}

public class ActivityHelloPrinter implements HelloPrinter {
    @Override
    public void print() {
        System.out.println("Hello Activity");
    }
}

And the code:

ApplicationComponent applicationComponent = DaggerApplicationComponent.builder().build();
applicationComponent.provideParrot().sayHello();
activityComponent = DaggerActivityComponent.builder()
                        .applicationComponent(applicationComponent).build();
activityComponent.provideParrot().sayHello();

My desired result:

Hello Application
Hello Activity

So, I made the modules:

ApplicationModule:

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {

    Parrot provideParrot();
}

@Module
public class ApplicationModule {

    @Provides
    @Singleton
    HelloPrinter providePrinter(){
        return new AppHelloPrinter();
    }

    @Provides
    Parrot provideParrot(HelloPrinter helloPrinter) {
        return new Parrot(helloPrinter);
    }

}

ActivityModule: Attempting to override HelloPrinter

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {

    Parrot provideParrot();

}

@Module
@PerActivity
public class ActivityModule {

    @Provides
    @PerActivity
    HelloPrinter provideHelloPrinter() {
        return new ActivityHelloPrinter();
    }     
}

But with this configuration, the output is:

Hello Application
Hello Application

What am I doing wrong? Thanks

+4
source share
1 answer

: .

.

  • , , HelloPrinter Parrot.
    Parrot .

  • , , HelloPrinter!

, ?

. , , .

applicationComponent.provideParrot().sayHello();

. , , .

activityComponent.provideParrot().sayHello();

, ( ) . , . , , , !
. , Parrot Factory.

factory . , , .

...

... Parrots , !

Gradle: : Parrot

2 , "". , .

. Parrot HelloPrinter, .

@Named(), / .

, , , - , , .

+2

Source: https://habr.com/ru/post/1616706/