Dagger2 Как выполнить инжекцию конструктора, который зависит от конструктора по умолчанию - PullRequest
1 голос
/ 25 июня 2019

Я хочу спросить, как сделать инъекцию конструктора, который не имеет никаких параметров. Я сталкивался с этой проблемой, но не смог найти решение. Вот мой класс репо

public class UrlsRepository {

    private UrlsSource urlsSource;

    @Inject
    public UrlsRepository(UrlsSource urlsSource){
        this.urlsSource = urlsSource;
    }

    public String getLandingUrl(){
        return urlsSource.getLoginUrl();
    }

    public String[] getDashboardUrls(){
        return urlsSource.getDashboardUrls();
    }
}

Вот интерфейс

public interface UrlsSource{
    String getLoginUrl();

    String[] getDashboardUrls();
}

и ниже - реализация

@Singleton
public class LocalUrlsSource implements UrlsSource {

    @Inject
    public LocalUrlsSource(){}

    @Override
    public String getLoginUrl() {
        return Properties.LOGIN_URL;
    }

    @Override
    public String[] getDashboardUrls() {
        return Properties.DASHBOARD_URLS;
    }
}

Теперь в моей основной деятельности я вводю UrlsRepository, но он нулевой. Пожалуйста, руководство.

public class MainActivity extends Activity implements MainPresenter.View {

    @Inject
    UrlsRepository urlsRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
    }
}

1 Ответ

1 голос
/ 25 июня 2019

Если вы не хотите внедрять такие интерфейсы, вам нужно создать @Module с аннотированным методом @Binds, например, таким:

@Module
abstract class UrlModule {

    @Binds
    abstract UrlsSource bindUrlsSource(LocalUrlsSource source);
}

И тогда вы создадите компонент, который использует этот модуль идобавьте в свою деятельность.

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

    void inject(MainActivity activity);
}

Затем запустите компонент в своем классе Application.java, извлеките его из своей деятельности и вызовите inject (), например, так:

public final class MainApplication extends Application {

    private static AppComponent appComponent;

    public static AppComponent getAppComponent() {
        return appComponent;
    }

    private static AppComponent createAppComponent(Application application) {
        return DaggerAppComponent.create();
    }

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

        appComponent = createAppComponent(this);
    }
}

Затем вы вводите зависимость следующим образом.

public class MainActivity extends Activity implements MainPresenter.View {

    @Inject
    UrlsRepository urlsRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // Injects this activity.
        MainApplication.getAppComponent().inject(this);
    }
}
...