2016-03-19 5 views
1

Я не могу встраивать зависимости через конструктор, и я уверен, что я делаю что-то неправильно. У меня есть следующие:Конструктор инъекции Кинжал 2

public class Water { 
    @Inject 
    public Water() {} 

    @Override 
    public String toString() { return "Water + ";} 
} 
public class Heater { 
    @Inject 
    public Heater() {} 

    @Override 
    public String toString() {return " heater";} 
} 

public class Aeropress { 
    Water mWater; 
    Heater mHeater; 

    @Inject 
    public Aeropress(Water water, Heater heater) { 
     mWater = water; 
     mHeater = heater; 
    } 

    @Override 
    public String toString() { 
     return mWater.toString() + mHeater.toString(); 
    } 
} 
public class LoginActivity extends AppCompatActivity{ 
    @Inject Aeropress aeropress; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.e("* 69 * LoginActivity *", "onCreate " + aeropress); 
} 

Код в отпечатках деятельности обнулить так Кинжал ничего не вводить. Любая идея, как решить эту проблему, не используя @provide? Что мне не хватает?

+0

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

+0

Я не уверен, как это должно работать. https://youtu.be/plK0zyRLIP8?t=16m42s в этом видео он удаляет последний @Provide, и он должен работать. Я попробую завтра этот пример – Tudor

+0

Он удалил весь метод провайдера для TwitterApiClient. Поставщик для OKHttpClient все еще существует и все еще используется. –

ответ

1

Для того, чтобы сделать это вы должны сделать 2 вещи:
1. Объявить компонент с помощью метода нагнетающего

@Component 
public interface AeropressComponent { 
    void inject(LoginActivity aeropress); 
} 

2. Постройте компонент кинжала в вашей деятельности и придать ему

public class LoginActivity extends AppCompatActivity{ 
    @Inject Aeropress aeropress; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     DaggerAeropressComponent.builder().build().inject(this); 
     /*DaggerAeropressComponent.create().inject(this);*/ //or this 
     Log.e("* 69 * LoginActivity *", "onCreate " + aeropress); 
} 

После этих изменений он работает как шарм, даже не создавая класс @Module. Логика, как я понимаю это, и причина, по которой вам нужен компонент, заключается в том, что для того, чтобы кинжал вводил новый экземпляр в аэропресс, ему нужен контейнер (активность), где можно найти ссылку на аэропресс. Кроме того, я просто вспомнил теперь, что причина, почему @Inject поле не может быть частным, что крестик делает прямое соответствие между эталонным и созданным, например, в моем примере это следующий

LoginActivity.aeropress = Factory.createAeropress(); 

Так что без создания компоненты с методом инъекции, он не может знать, где положить экземпляр, созданный с помощью Factory.createAeropress(); Если кто-нибудь может дать мне лучшее решение, я отметю ответ

+3

«Если кто-нибудь может дать мне лучшее решение» - вы все делаете правильно :) –

+0

@DavidMedenjak рад узнать^_ ^ – Tudor

Смежные вопросы