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

如何使用AndroidInjector在模块内部获取MainActivity,第1张

概述使用dagger- android,现在可以简单地编写以下内容并成功注入应用程序的依赖项: @Modulepublic abstract class MainActivityModule { @ContributesAndroidInjector abstract MainActivity contributesMainActivity();}@Singleton@Compone 使用dagger- android,现在可以简单地编写以下内容并成功注入应用程序的依赖项:

@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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1122618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存