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.
- Escopetas en Dagger 2
- Dagger2 dagger.android. * Las clases no existen
- Dagger 2, módulos de biblioteca y @Singleton
- ¿Cuándo usar Dagger en la aplicación Android?
- Referencia no resuelta para Dagger 2 en Kotlin
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); } }
- Ciclo de inclusión del módulo Dagger
- Campo no inyectado en el proyecto Android Dagger
- Java.lang.NoClassDefFound usando Dagger 2 para Android 4
- Dagger 2 "Dagger" prefijo componente no es capaz de compilar? Clase generada automáticamente
- ¿Cómo anula un módulo / dependencia en una prueba de unidad con Dagger 2.0?
- Componente Dagger2 con más de una dependencia
- Dagger 2, a veces en la compilación me sale "no se puede encontrar la clase de símbolo DaggerApplicationComponent"
- ¿Cómo inyectar dependencias pojo usando dagger 2?
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.
- RxJava noClassDefFoundError: rx.plugins.RxJavaPlugins en la API 16
- AnimationDrawable no funciona en la versión 2.3.6 android