Кинжал 2: Как внедрить объект, созданный в методе @Provides?

Я получил это:

Bike.java

public class Bike {
    String serial;

    @Inject
    Wheels wheels;

    public Bike(String serial) {
        this.serial = serial;
    }
}

BikeModule.java

@Module
public class BikeModule {
    @Provides
    public Bike provideBike() {
        return new Bike("BIK-001");
    }

    @Provides
    public Wheels provideWheels() {
        return new Wheels("WLS-027");
    }
}

BikeComponent.java

@Component(modules = BikeModule.class)
public interface BikeComponent {
    Bike bike();
}

Теперь вот проблема: когда я звоню BikeComponent.bike() Достаю байк с серийником BIK-001, как и предполагалось, но колеса не впрыскиваются. Однако, если я аннотирую Bike конструктор с @Inject и удалите BikeModule.provideBike() метод, колеса впрыскиваются. Таким образом, проблема заключается в том, чтобы ввести объект, созданный в @Provides метод, а не созданный самим Кинжалом.

Есть ли способ сказать Dagger, чтобы ввести предоставленный объект?

1 ответ

Решение

Перепишите так:

public class Bike {

    private final String serial;
    private final Wheels wheels;

    @Inject
    public Bike(String serial, Wheels wheels) {
        this.serial = serial;
        this.wheels = wheels;
    }
}

@Module
public final class BikeModule {

    @Provides
    public static Bike provideBike(Wheels wheels) {
        return new Bike("BIK-001", wheels);
    }

    @Provides
    public static Wheels provideWheels() {
        return new Wheels("WLS-027");
    }
}
Другие вопросы по тегам