Интерфейс @inject не является реализацией этого в dagger2 android

Я хочу ввести 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

Для внедрения поля вы должны предоставить метод, который принимает war в качестве параметра в соответствующем component, чтобы dagger понимал, что вы хотите внедрить поля класса war.

Abu Yousuf 13.05.2018 09:24

@AbuYousuf в HouseComponent, как показано ниже? @Component (modules = HouseModule.class) interface HouseComponent {void getHouse (Война войны); } это не работает

Mohammad Ranjbar Z 13.05.2018 09:29

Какую ошибку вы получаете? Укажите свой код WarComponent

Abu Yousuf 13.05.2018 09:33

Прежде всего, вы поле смешивания с инъекцией конструктора, поэтому №2 должен компилироваться, но не работать. Кроме этого, ваш WarComponent, скорее всего, ничего не знает о HouseComponent, поэтому он не может связывать Старка как House. Либо сделайте war субкомпонентом, либо добавьте зависимость компонента от house.

David Medenjak 13.05.2018 09:38

@DavidMedenjak # 2 работает, # 1 не работает, а # 2 зависит от класса war от класса stark, я хочу, чтобы # 1 работал с независимым war.class от stark.class или любой домашней реализации

Mohammad Ranjbar Z 13.05.2018 10:07

# 2 будет нулевым, как указано в связанном вопросе, если у вас нет еще кода для внедрения поля, которым вы не поделились. Он должен компилироваться, но не «работать». Трудно сказать, почему №1 не сработает, раз вы не поделились с нами WarComponent. Я предполагаю, что ваш WarComponent ничего не знает о HouseComponent, поэтому он не может связывать Старка как Дом. Так что либо сделайте войну подкомпонентом, либо добавьте зависимость компонента от дома.

David Medenjak 13.05.2018 10:10

извините @DavidMedenjak, я думал, что у меня общий доступ к военному компоненту, я редактирую свой пост Component public interface WarComponent {War getWar (); void inject (война войны); }

Mohammad Ranjbar Z 13.05.2018 10:12

Как я и предполагал, WarComponent ничего не знает о HouseComponent, поэтому он не может связывать Старка как Дом. Так что либо сделайте WarComponent субкомпонентом, либо добавьте зависимость компонента от HouseComponent.

David Medenjak 13.05.2018 10:15
WarComponent не знает HouseModule, поэтому, конечно, вы не можете использовать HouseInterface.
EpicPandaForce 19.05.2018 00:36
1
9
124
0

Другие вопросы по теме