Я хочу ввести inteface и dagger автоматически ввести мою реализацию, но я получил ошибку
public interface HouseInterface {
String sayHello();}
* реализация интерфейса ниже *
public class Stark implements HouseInterface{
@Inject
public Stark(){}
@Override
public String sayHello() {
return "stark";
}
}
модуль интерфейса дома
@Module public class HouseModule {
@Provides
public HouseInterface getHouse(Stark stark){
return stark;
}
}
* компонент дома: *
@Component(modules = HouseModule.class) interface HouseComponent {
HouseInterface getHouse();
}
Военный класс:
public class War {
@Inject
public War() {
}
//#1
//this not working
@Inject
HouseInterface houseInterface;
//this works
//#2
// @Inject
//Stark stark;
//#3
// this works//HouseComponent houseComponent = DaggerHouseComponent.builder().houseModule(new HouseModule()).build();
//HouseInterface houseInterface = houseComponent.getHouse();
public String getHouseName() {
return houseInterface.sayHello();
}
}
WarComponent класс
@Component
public interface WarComponent {
War getWar();
void inject(War war);
}
когда я тестирую код с помощью следующих кодов:
@Test
public void printNameTest() {
String expected = "stark";
WarComponent component = DaggerWarComponent.create();
War war= component.getWar();
Assert.assertEquals(war.getHouseName(), expected);
}
если в классе War мы используем # 1 для инъекции, не работает, но если используем # 2 или # 3, которые в приведенных выше кодах прокомментированы, инъекция не работает, у кого-нибудь есть идеи? потому что я не хочу, чтобы этот war.class зависел от Stark.class, и я хочу, чтобы он зависел только от HpuseInterface, поэтому мне нужен рабочий номер 1
@AbuYousuf в HouseComponent, как показано ниже? @Component (modules = HouseModule.class) interface HouseComponent {void getHouse (Война войны); } это не работает
Какую ошибку вы получаете? Укажите свой код WarComponent
Прежде всего, вы поле смешивания с инъекцией конструктора, поэтому №2 должен компилироваться, но не работать. Кроме этого, ваш WarComponent, скорее всего, ничего не знает о HouseComponent, поэтому он не может связывать Старка как House. Либо сделайте war субкомпонентом, либо добавьте зависимость компонента от house.
@DavidMedenjak # 2 работает, # 1 не работает, а # 2 зависит от класса war от класса stark, я хочу, чтобы # 1 работал с независимым war.class от stark.class или любой домашней реализации
# 2 будет нулевым, как указано в связанном вопросе, если у вас нет еще кода для внедрения поля, которым вы не поделились. Он должен компилироваться, но не «работать». Трудно сказать, почему №1 не сработает, раз вы не поделились с нами WarComponent. Я предполагаю, что ваш WarComponent ничего не знает о HouseComponent, поэтому он не может связывать Старка как Дом. Так что либо сделайте войну подкомпонентом, либо добавьте зависимость компонента от дома.
извините @DavidMedenjak, я думал, что у меня общий доступ к военному компоненту, я редактирую свой пост Component public interface WarComponent {War getWar (); void inject (война войны); }
Как я и предполагал, WarComponent ничего не знает о HouseComponent, поэтому он не может связывать Старка как Дом. Так что либо сделайте WarComponent субкомпонентом, либо добавьте зависимость компонента от HouseComponent.
WarComponent не знает HouseModule, поэтому, конечно, вы не можете использовать HouseInterface.
Для внедрения поля вы должны предоставить метод, который принимает
warв качестве параметра в соответствующемcomponent, чтобыdaggerпонимал, что вы хотите внедрить поля классаwar.