Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用AndroidInjector在模块内部获取MainActivity大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用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显式地将依赖项公开给片段管理器:

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

我现在需要提供这种依赖.怎么去做呢?所以我尝试了以下内容

@module
public 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;
   }
}

@module
public 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.Module
public class MainActivitymodule {
   @Provides
   FragmentManager provideFragmentManager(MainActivity mainActivity) {
    return mainActivity.getSupportFragmentManager();
   }
}
@H_100_5@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所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。