Cómo obtener MainActivity dentro de un módulo usando AndroidInjector
Con dagger-android
uno ahora puede simplemente escribir lo siguiente e inyectar con éxito las dependencias de la aplicación:
@Module public abstract class MainActivityModule { @ContributesAndroidInjector abstract MainActivity contributesMainActivity(); } @Singleton @Component(modules = { AndroidSupportInjectionModule.class, AndroidInjectionModule.class, AppModule.class, MainActivityModule.class }) public interface ApplicationComponent { void inject(BaseApplication baseApplication); @Component.Builder interface Builder { @BindsInstance Builder application(Application application); ApplicationComponent build(); } } @Module public abstract class AppModule {} public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector { @Inject DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector; @Inject Whatever whatever; @Override protected void onCreate(Bundle savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public AndroidInjector<Fragment> supportFragmentInjector() { return dispatchingAndroidInjector; } } public class BaseApplication extends Application implements HasActivityInjector { @Inject DispatchingAndroidInjector<Activity> dispatchingAndroidInjector; @Override public AndroidInjector<Activity> activityInjector() { return dispatchingAndroidInjector; } @Override public void onCreate() { DaggerApplicationComponent.builder() .application(this) .build() .inject(this); super.onCreate(); } } public class Whatever { private final FragmentManager fragmentManager; @Inject Whatever(MainActivity mainActivity) { this.fragmentManager = mainActivity.getSupportFragmentManager(); } }
Un ejemplo muy trivial. Básicamente cable todo para poder conseguir el objeto Whatever
con el administrador de fragmento correcto inyectado. Esto está bien y funciona.
- Dagger 2 en Android, sin mensajes de error
- Cómo soportar múltiples puntos finales con Dagger 2.0 mientras usa MockWebServer
- Dagger 2 e implementaciones de interfaz
- ¿Deberían inyectarse los presentadores (mvP) (dagger2) a las vistas en android?
- Android Dagger 2 y MVP se inyectan dentro de un objeto inyectado
Sin embargo, ¿qué pasa si quiero usar la actividad principal dentro de un módulo? Decir que quiero hacer realmente Whatever
que exponga explícitamente la dependencia al gestor de fragmentos cambiando el argumento del constructor:
@Inject Whatever(FragmentManager fragmentManager) {...}
Ahora necesito proporcionar esta dependencia. ¿Cómo se hace? Así que he intentado lo siguiente:
@Module public abstract class MainActivityModule { @ContributesAndroidInjector abstract MainActivity contributesMainActivity(); @Provides static FragmentManager providesFragmentManager(MainActivity activity) { return activity.getSupportFragmentManager(); } }
Ahora dagger se queja de que no puede encontrar un @Providers
para MainActivity
. Pensé que el método @ContributesAndroidInjector
sería capaz de proporcionar la actividad. También estoy un poco perplejo en cuanto a cómo no tiene ningún problema de inyectar la dependencia en el primer caso, pero ahora no puede hacerlo.
También he intentado construir una fábrica para esto, algo así como:
public FragmentManagerFactory { private final FragmentManager fm; @Inject FragmentManagerFactory(MainActivity mainActivity){ this.fm = mainActivity.getSupportFragmentManager(); } public FragmentManager get() { return fm; } } @Module public abstract class MainActivityModule { @ContributesAndroidInjector abstract MainActivity contributesMainActivity(); @Provides static FragmentManager providesFragmentManager(FragmentManagerFactory fragmentManagerFactory) { return fragmentManagerFactory.get(); } }
Que termina en el mismo error.
¿Alguien ha logrado hacer esto? Antes de que fuera bastante fácil, uno sólo construiría el módulo con la instancia de MainActivity
almacenaría en un campo y proporcionaría eso. Ahora … todo sucede detrás de las cortinas.
Apreciaría mucho ayuda!
- Dagger2: El componente no puede depender de varios componentes de ámbito
- Cómo usar correctamente Dagger2 con los nuevos componentes de arquitectura de Android
- OkHttp Interceptor utilizando OkHttpClient sin ciclo de dependencia
- Referencia sin resolver DaggerApplicationComponent
- Dagger 2 y Android Data Binding conflict
- La clase generada para Component of Dagger 2 no se encuentra en compileTestJava del complemento Java de Gradle
- Llamar a un método de la actividad probada de una prueba usando espresso y ver sus resultados
- Dagger 2 Named no se puede proporcionar sin un método @Provides
En mi configuración tengo un di/
paquete en la raíz de sub-di-packages
en mi ui/
package. En el paquete ui/di
he declarado el siguiente módulo y componente:
@dagger.Module public class MainActivityModule { @Provides FragmentManager provideFragmentManager(MainActivity mainActivity) { return mainActivity.getSupportFragmentManager(); } }
MainActivitySubcomponent
@Subcomponent(modules = MainActivityModule.class) public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> { @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<MainActivity> { } }
en el paquete di
nivel superior donde guardo mi ApplicationComponent
, tengo un module
adicional
@Module(subcomponents = {MainActivitySubcomponent.class }) public abstract class BuildersModule { @Binds @IntoMap @ActivityKey(MainActivity.class) abstract AndroidInjector.Factory<? extends Activity> mainActivityBinder(MainActivitySubcomponent.Builder builder); }
Y como se puede imaginar BuildersModule
, es parte de @Component(modules = {
de ApplicationComponent
.
Exención de responsabilidad: Soy bastante nuevo en dagger2 y todavía estoy tratando de averiguar un montón de cosas. Puede haber mejores maneras de lograr lo que necesita.
- Cómo transmitir a través de mms: //
- Error al importar el tipo de lista en un archivo xml mediante la vinculación de datos de Android