2016-03-04 3 views
2

У меня есть этот модуль:Как ввести объект Activity в объект, который вводится в Activity?

@Module 
public class UserProfileModule { 

    @Provides 
    @Singleton 
    UserProfileController providesUserProfileController() { 
     return new UserProfileController(); 
    } 

} 

и этот компонент:

@Component(modules = {UserProfileModule.class}) 
@Singleton 
public interface AppComponent { 

    void inject(UserProfileActivity activity); 

} 

До сих пор в моем UserProfileActivity я могу @InjectUserProfileController. Но теперь мне нужно ввести контроллер UserProfileActivity. Я имею в виду, впрыскивать друг друга.

Я мог бы сделать это, позвонив по телефону UserProfileController сеттера в UserProfileActivity: setActivity(this);, но было бы неплохо, если бы оно было автоматическим.

Как это можно достичь?

Спасибо.

ответ

2

Для начала: добавьте его в конструктор. Затем объявите эту зависимость.

@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 вы можете создать новый экземпляр модуля с активностью в качестве аргумент. После этого правильная поставка будет предоставлена.

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