android dagger не получается создать даггер
Всем привет! Есть проект хочу сделать рефакторинг, изменить зависимости используя dagger, до него выглядит вот так
public class Activity extends AppCompatActivity implements TrimContractView {
VideoActionPresenter presenter;
......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
VideoActions videoActions = new VideoActions(getApplicationContext(), uri);
VideoActionsModel videoActionsModel = new VideoActionsModel(videoActions, this);
presenter = new VideoActionPresenter(videoActionsModel, pinCodeMode);
}
.......
}
Как мне инициализировать context, uri , activity и т.д. чтобы они работали в даггер? Может мне поменять схему создания реализации даггера? Может через компоненты или любой другой способ, буду вам благодарен !
Module
@Module
public class VideoActionsModule {
private final Context context;
private final Uri uri;
private final Activity activity;
private final Constants.PinCodeMode pinCodeMode;
public VideoActionsModule(Context context, Constants.PinCodeMode pinCodeMode, Activity activity, Uri uri) {
this.context = context;
this.pinCodeMode = pinCodeMode;
this.activity = activity;
this.uri = uri;
}
@Singleton
@Provides
Context provideContext() {
return context;
}
@Singleton
@Provides
Activity provideActivity() {
return activity;
}
@Singleton
@Provides
Constants.PinCodeMode provideConstantsPinCodeMode() {
return pinCodeMode;
}
@Singleton
@Provides
Uri provideUri() {
return uri;
}
@Singleton
@Provides
VideoActions provideVideoActions(Context context, Uri uri) {
return new VideoActions(context, uri);
}
@Singleton
@Provides
VideoActionsModel provideVideoActionsModel(VideoActions videoActions, Activity activity) {
return new VideoActionsModel(videoActions, activity);
}
@Singleton
@Provides
VideoActionPresenter provideVideoActionPresenter(VideoActionsModel videoActionsModel, Constants.PinCodeMode pinCodeMode) {
return new VideoActionPresenter(videoActionsModel, pinCodeMode);
}
}
Component
@Singleton
@Component(modules = VideoActionsModule.class)
public interface VideoActionsComponent {
VideoActionPresenter injectVideoActions();
}
App
public class App extends Application {
private static App instance;
private VideoActionsComponent videoActionsComponent;
@Override
public void onCreate() {
super.onCreate();
instance = this;
VideoActionsModule videoActionsModule = new VideoActionsModule(this, pinCodeMode, activity, uri);
videoActionsComponent = DaggerVideoActionsComponent.builder().videoActionsModule(videoActionsModule).build();
}
public static App getInstance() {
return instance;
}
public VideoActionsComponent getVideoActionsComponent() {
return videoActionsComponent;
}
}
Новый MainActivity
public class Activity extends AppCompatActivity implements TrimContractView {
@Inject
VideoActionPresenter presenter;
......
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
App.getInstance().getVideoActionsComponent().injectVideoActions();
}
.......
}
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Активити в Application вы не получите - оно ещё не создано в этот момент. Да и его вообще может не быть.
Если вашим зависимостям нужна активити - создавайте модуль/компонент в активити, не в Application. И не забывайте модуль уничтожать при уничтожении активити.
Вот тут есть пример кода:
