如何使用AndroidInjector在模块内部获取MainActivity

时间:2017-07-27 14:20:33

标签: android dagger-2 dagger

使用webserver现在可以简单地编写以下内容并成功注入应用程序的依赖项:

dagger-android

一个非常简单的例子。基本上连接所有内容,以便能够通过注入正确的片段管理器来获取对象@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(); } } 。这没关系并且有效。

但是,如果我想在模块中使用主要活动怎么办?假设我想让Whatever通过更改构造函数参数显式地将依赖项公开给片段管理器:

Whatever

我现在需要提供这种依赖。怎么去做呢?所以我尝试了以下方法:

@Inject
Whatever(FragmentManager fragmentManager) {...}

现在dagger抱怨它找不到@Module public abstract class MainActivityModule { @ContributesAndroidInjector abstract MainActivity contributesMainActivity(); @Provides static FragmentManager providesFragmentManager(MainActivity activity) { return activity.getSupportFragmentManager(); } } 的{​​{1}}。我认为@Providers方法可以提供活动。我对在第一种情况下如何注入依赖项没有问题感到有些疑惑,但现在它无法做到。

我也尝试为此建立工厂,例如:

MainActivity

最终会出现同样的错误。

有没有人设法做到这一点?在它变得非常简单之前,只需构建模块,并将@ContributesAndroidInjector实例存储在一个字段中并提供它。现在......一切都发生在窗帘后面。

非常感谢一些帮助!

1 个答案:

答案 0 :(得分:7)

在我的设置中,我的di/包中的sub-di-packages根目录中有ui/个包。在ui/di包中,我已经声明了以下模块和组件:

@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> {
    }
}

在我保留di的顶级ApplicationComponent包中,我还有module

@Module(subcomponents = {MainActivitySubcomponent.class })
public abstract class BuildersModule {

   @Binds
   @IntoMap
   @ActivityKey(MainActivity.class)
   abstract AndroidInjector.Factory<? extends Activity> mainActivityBinder(MainActivitySubcomponent.Builder builder);

}

正如您可以想象的那样BuildersModule@Component(modules = {的{​​{1}}的一部分。

声明: <子> 我是dagger2的新手,我仍然试图弄清楚很多东西。可能有更好的方法来实现您的需求。 功能