Dagger v2: Inyectar 2 ámbitos diferentes en un objeto

Tengo la configuración de moduleA como un proveedor de Singleton de aplicación amplia, ModuleB como un proveedor de objetos relacionados con el usuario

Mi fragmento de visualización de usuario utilizará bus de sistema ancho para enviar mensajes a otros y utilizar objetos relacionados con el usuario para mostrar.

El problema no puede inyectar la clase scrope diferente en un objeto. Use el método component.getX funciona bien, pero inyectar es la forma preferida. Mensaje de error: @UserScope no puede hacer referencia a enlaces con marcos de diferencia: @Provides @Singleton Bus ModuleA.provideBus ()

@Module public class ModuleA { @Provides @Singleton Bus provideBus() {...} } 

Módulo B como proveedor de información relacionado con el usuario

 @Module public class ModuleB{ private final User user; public ModuleB(User user) {...} @Provides @UserScope User provideUser() {} @Provides @UserScope UserManager provideUserManager() {} } 

Componentes de configuración como sigue:

 @Component (modules={ModuleA.class}) @Singleton public interface ComponentA { Bus getBus(); void inject(ClassA target); } @Component(modules={ModuleB.class}) @UserScope public interface ComponentB { User getUser(); UserManager getUserManager(); void inject(ClassA target); } class UserFragment exrtends Fragment { @Inject Bus bus; @Inject UserManager userManager; public void onCreate() { getComponentA().inject(this); getComponentB().inject(this); } } 

Pruebe esta configuración, funciona para mí. Hay realmente una carencia de la buena documentación sobre Dagger2 así que estudié algunos ejemplos del código abierto que usted puede encontrar en GitHub etc por la palabra clave como Dagger2.

Nivel de aplicación Componente

 @Singleton @Component(modules = AppModule.class) public interface AppComponent { // exported for child-components Bus eventBus(); } 

Módulo de nivel de aplicación

 @Module public class AppModule { @Provides @Singleton Bus provideBus() { return BusProvider.getInstance(); } } 

Nivel de actividad Componente

 @ActivityScope @Component(dependencies=AppComponent.class, modules=MainActivityModule.class) public interface MainActivityComponent { void inject( MainActivity mainActivity ); } 

Módulo de nivel de actividad

 @Module public class MainActivityModule { private final MainActivity mActivity; public MainActivityModule( MainActivity activity ) { mActivity = activity; } @Provides MainActivityTitleController provideTitleController() { return new MainActivityTitleController( mActivity ); } } 

Clase de aplicaciones de Android

 public class MyApplication extends Application { private AppComponent mAppComponent; @Override public void onCreate() { super.onCreate(); // Dagger2 mAppComponent = Dagger_AppComponent.builder() .appModule( new AppModule( this )) .build(); } public AppComponent getComponent() { return mAppComponent; } public static AppComponent getComponent( Context context ) { return ((MyApplication)context.getApplicationContext()).getComponent(); } } 

Y finalmente Actividad

 public class MainActivity extends ActionBarActivity { // Injectable fields @Inject Bus mEventBus; @Inject MainActivityTitleController mTitleController; private MainActivityComponent mComponent; @Override protected void onCreate( Bundle savedInstanceState ) { // Dagger2 mComponent = Dagger_MainActivityComponent.builder() .appComponent( ((MyApplication)getApplication()).getComponent() ) .mainActivityModule( new MainActivityModule( this ) ) .build(); mComponent.inject( this ); } } 

Creo que el problema principal en los fragmentos de código que ha proporcionado, es que su ModuleB debe tener una dependencia de ModuleA para proporcionar correctamente el singleton con el error que estaba recibiendo. Es decir esto debería funcionar:

 @Component(modules={ModuleB.class}, dependencies = ComponentA.class) @UserScope public interface ComponentB { User getUser(); UserManager getUserManager(); void inject(MainActivity target); } 

He recreado tus clases y he hecho algunos supuestos para llenar los espacios en blanco, y parece que funciona bien. Puedes ver el código de trabajo completo aquí en GitHub . La única diferencia en mi código es, lo que usted llamó ClassA / UserFragment Acabo de llamar MainActivity pero de lo contrario la estructura es la misma.

  • Dagger se puede utilizar para realizar la inyección en un proveedor de contenido?
  • ¿Puedo extender una aplicación personalizada en Espresso?
  • @Injects después de @Produces?
  • Dagger - clase no tiene miembros inyectables
  • Dagger 2 inyectar parámetros del constructor
  • Dagger 2.2 método del módulo de constructor de componentes obsoleto
  • Dagger código que da NoClassDefFoundError en las pruebas de instrumentación de Android, pero funciona en la aplicación normal
  • Qué es exactamente la daga y cómo funciona
  • ¿Es posible usar Dagger en el proyecto de la biblioteca?
  • Alcance de la actividad Dagger2, ¿cuántos módulos / componentes necesito?
  • Dagger2 - nulo en lugar del objeto inyectado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.