@Modulepublic 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(); }}@Modulepublic 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显式地将依赖项公开给片段管理器:
@InjectWhatever(FragmentManager fragmentManager) {...}
我现在需要提供这种依赖.怎么去做呢?所以我尝试了以下内容:
@Modulepublic abstract class MainActivityModule { @ContributesAndroIDInjector abstract MainActivity contributesMainActivity(); @ProvIDes static FragmentManager provIDesFragmentManager(MainActivity activity) { return activity.getSupportFragmentManager(); }}
现在匕首抱怨它找不到MainActivity的@ProvIDers.我认为@ContributesAndroIDInjector方法能够提供活动.对于在第一种情况下注入依赖项没有问题,我也有点疑惑,但现在它无法做到.
我也尝试为此建立一个工厂,例如:
public FragmentManagerFactory { private final FragmentManager fm; @Inject FragmentManagerFactory(MainActivity mainActivity){ this.fm = mainActivity.getSupportFragmentManager(); } public FragmentManager get() { return fm; }}@Modulepublic abstract class MainActivityModule { @ContributesAndroIDInjector abstract MainActivity contributesMainActivity(); @ProvIDes static FragmentManager provIDesFragmentManager(FragmentManagerFactory fragmentManagerFactory) { return fragmentManagerFactory.get(); }}
最终会出现同样的错误.
有没有人设法做到这一点?在它变得非常简单之前,只需使用MainActivity实例构建模块就可以将其存储在一个字段中并提供它.现在……一切都发生在窗帘后面.
非常感谢一些帮助!
解决方法 在我的设置中,我的ui /包中的sub-di-packages的根目录中有di / package.在ui / di包中,我声明了以下模块和组件:@dagger.Modulepublic 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> { }}
在我保留ApplicationComponent的顶级di包中,我有一个额外的模块
@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 = {of ApplicationComponent.
免责声明:
我是dagger2的新手,我仍然试图弄清楚很多东西.可能有更好的方法来实现您的需求.
总结以上是内存溢出为你收集整理的如何使用AndroidInjector在模块内部获取MainActivity全部内容,希望文章能够帮你解决如何使用AndroidInjector在模块内部获取MainActivity所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)