Для начала: добавьте его в конструктор. Затем объявите эту зависимость.
@Provides
@Singleton
UserProfileController providesUserProfileController(UserProfileActivity activity) {
return new UserProfileController(activity);
}
После этого кинжала будет жаловаться не в состоянии обеспечить UserProfileActivity
, если вы уже не сделаете. Если вы этого не сделаете, добавьте еще один модуль или просто укажите зависимость от того же модуля. Ниже приведена фактическая реализация, прежде всего, мы должны исправить ваш код.
@Singleton
является зависимостью от top от иерархии. Вы не можете — или не менее не должны — имеют зависимость активности для объекта аннотированного объекта @Singleton
, так как это, вероятно, приведет к неприятным запахам и/или утечкам памяти. Представьте пользовательскую область действия @PerActivity
для использования в зависимости от продолжительности вашей деятельности.
@Scope
@Retention(RUNTIME)
public @interface PerActivity {}
Это позволит правильно определить область объекта. Обратите также внимание на некоторые уроки о кинжале, так как это очень важная проблема, и охватить все в одном ответе будет слишком много. например Tasting dagger 2 on android
Следующая использует последний подход вышеупомянутых 2-х вариантов путем расширения вашего модуля:
@Module
public class UserProfileModule {
private final UserProfileActivity mActivity;
public UserProfileModule(UserProfileActivity activity) {
mActivity = activity;
}
@Provides
@PerActivity
UserProfileActivity provideActivity() {
return mActivity;
}
@Provides // as before
@PerActivity
UserProfileController providesUserProfileController(UserProfileActivity activity) {
return new UserProfileController(activity);
}
}
Если теперь использовать компонент Builder
вы можете создать новый экземпляр модуля с активностью в качестве аргумент. После этого правильная поставка будет предоставлена.