Dagger 2 mixed scopes

dmitriyzaitsev

Previously I had only one AppComponent with four modules (AppModule, NetworkModule, StorageModule, PresentersModule) and injected singletons everywhere. Recently, I decided to make small refactoring in my app and divide it into scopes. I think, presenters can live within activities only, so I created @ActivityScope and ActivityModule, but the project cannot be compiled because of my misunderstanding how to mix these scopes. I've read a lot of articles and questions at stackoverflow, but everywhere there are simple examples where modules are independent. In my case such thing as

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {
  ActivityComponent plus(PresentersModule module); // <-- error
}

is not working. I get this error:

Error:(19, 1) error: com.my.package.di.component.ActivityComponent scoped with @com.my.package.di.scope.ActivityScope may not reference bindings with different scopes:
@Provides @Singleton android.app.Application com.my.package.di.module.AppModule.provideApplication()
@Provides @Singleton com.my.package.network.FeedBurnerApi com.my.package.di.module.NetworkModule.provideFeedBurnerApi(android.app.Application)
@Provides @Singleton android.database.sqlite.SQLiteOpenHelper com.my.package.di.module.StorageModule.provideSQLiteOpenHelper(android.app.Application)
@Provides @Singleton com.my.package.storage.Repository com.my.package.di.module.StorageModule.provideRepository(android.database.sqlite.SQLiteOpenHelper)
@Provides @Singleton com.my.package.SharedPreferencesHelper com.my.package.di.module.StorageModule.provideSharedPreferencesHelper(android.app.Application)

So, the question is how I can get the instance of my ActivityComponent?

You can see dependencies between modules below:

Application module:

@Module
public final class AppModule {
  private final MyApplication mApplication;

  public AppModule(MyApplication application) { ... }

  @Provides @Singleton Application provideApplication() { ... }
}

Network module:

@Module(includes = { AppModule.class })
public final class NetworkModule {
  @Provides @Singleton FeedBurnerApi provideFeedBurnerApi(Application application) { ... }

  @Provides @Singleton Retrofit provideRetrofit() { ... }
}

Storage module:

@Module(includes = { AppModule.class })
public final class StorageModule {
  @Provides @Singleton Repository provideRepository(SQLiteOpenHelper sqLiteOpenHelper) { ... }

  @Provides @Singleton SQLiteOpenHelper provideSQLiteOpenHelper(Application application) { ... }

  @Provides @Singleton SharedPreferencesHelper provideSharedPreferencesHelper(Application application) { ... }
}

Presenters module:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule {
  @Provides FeedPageViewPresenter provideFeedPageViewPresenter(FeedBurnerApi api, Repository repository, SharedPreferencesHelper preferences) { ... }

  @Provides @ActivityScope SlidingTabsViewPresenter provideSlidingTabsViewPresenter(Repository repository) { ... }
}

Application component:

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {}

Activity component:

@Subcomponent(modules = PresentersModule.class)
@ActivityScope
public interface ActivityComponent {
  void inject(FeedPageView view);

  void inject(SlidingTabsView view);
}
dmitriyzaitsev

The problem was in my PresentersModule.

Since Subcomponents have access to entire objects graph from their parents, I don't need to include these dependencies in my sub-module. So, I changed this code:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule { ... }

with this:

@Module
public final class PresentersModule { ... }

and it solved my issue.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Dagger 2 Scopes, где разместить докладчиков?

Dagger 2 Scopes, where to place Presenters?

Cómo anular dependencias dentro de Scopes en Dagger 2

Как мне вводить поля во время выполнения с помощью Dagger 2?

Dagger 2, Как добавить интерфейс в зависимость

Как мне добавить неизвестное количество неизвестных модулей в Dagger 2?

Dagger 2 доступ к именованным зависимостям в зависимом модуле

Как я могу избежать установки всех модулей моего компонента в действии для внедрения зависимостей с помощью Dagger 2?

SpringBoot OAuth2: цель функции .scopes ()?

Dagger2 no genera clases Dagger *

Модернизация с помощью Dagger 2 - android

AndroidAnnotations和Dagger 2

Alcances en Dagger 2

Componente Dagger 2 no generado

Все же необходимо проверять объект на нуль, если он инициализирован с помощью Dagger2?

Понимание синглтона отложенной инициализации в Dagger2 ScopedProvider, автор Грегори Кик

Dagger 2 singleton no funciona

Dagger 2 - внедрение классов, отличных от Android

Dagger 2 component not generated

Одноэлементная аннотация Dagger2 не работает

Подкомпонент Dagger 2 в модулях Android

Попытка реализовать MVP с помощью Dagger 2 - Как мне получить ссылку на Activity в предоставленном презентаторе

Dagger2 не может вводить поле внутри внедренного класса

Dagger 2 no inyecta sharedPreference

Ошибка Dagger 2: зависимость «не может быть предоставлена без конструктора @Inject»

Dagger 2 no genera componentes

Android Dagger2

Исключение нулевого указателя для Dagger-2 (android)

Как добавить DI (Dagger 2) в Activity и его родительский элемент

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    OAuth 2.0 utilizando Spring Security + WSO2 Identity Server

  3. 3

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  4. 4

    Ver todos los comentarios en un video de YouTube

  5. 5

    uitableview delete button image in iOS

  6. 6

    ¿Título del selector de SwiftUI?

  7. 7

    Swift / Firebase : Facebook 사용자가 계정을 만들 때 Firebase 데이터베이스에 제대로 저장하려면 어떻게해야합니까?

  8. 8

    ¿Es posible reemplazar los valores de un archivo config.properties a través de TFS?

  9. 9

    Representación de mapas 3D en juegos

  10. 10

    Golang ListenAndServeTLS devuelve datos cuando no se usa https en el navegador

  11. 11

    Declarar propiedades reactivas (agregar bloques de componentes dinámicamente desde la inserción de matriz)

  12. 12

    Cómo hacer que SwiftUI Text multilineTextAlignment comience desde arriba y centro

  13. 13

    Cómo depurar una aplicación React en Visual Studio 2019 usando la plantilla "Blank Node.js"

  14. 14

    Múltiples relaciones en la misma tabla con dos columnas Laravel

  15. 15

    No existe tal archivo o directorio cuando se inicia el nombre del directorio con /

  16. 16

    Verilog : 입력 신호를 한 클럭 주기로 지연시키는 방법은 무엇입니까?

  17. 17

    ¿Cómo hacer un generador de ruido Perlin más suave?

  18. 18

    Problème avec le dessin d'un élément Qml avec des appels OpenGL bruts

  19. 19

    El nombre 'HttpContext' no existe en el contexto actual en Razor

  20. 20

    WPF pleine largeur DataGridColumn sur la largeur de DataGrid

  21. 21

    Tengo algunos problemas con el syscall de golang cuando llamo a dll en win7-64

CalienteEtiquetas

Archivo