在Dagger中插入一个需要创建活动的对象

时间:2019-07-13 14:57:38

标签: android-activity dagger-2 inject

问候所有!

请帮助我确定是否需要解决的情况符合Dagger概念。

我必须在我的Activity中注入一个类,该类需要创建此Activity。我想到的唯一方法是将活动添加到模型,并在对象的Provides方法中使用它。听起来像是正常使用情况吗?

@Module
public class SampleDiModule {
  private Activity activity;

  public SampleDiModule(Activity activity){
     this.activity = activity;
  }

  @Provides
  @ModuleScope
  public InjectedObject provideInjectedObject(){
     return new InjectedObject.createForAcivity(activity)
  }
}

我打算注入活动演示者,演示者依赖于只能由对象工厂以以下方式创建的对象

public MyPresentor(InjectedObject object){
}


InjectedObject object = InjectedObjectFactory.forActivity(this)

谢谢

1 个答案:

答案 0 :(得分:1)

好的,有多种方法可以实现。

其中两个在我的脑海中。

首先,使用Dagger范围。您可以创建@Activity范围,该范围将管理具有与特定活动的生命相关联的生命的对象。创建作用域为活动的dagger模块时,可以将活动引用作为构造函数参数传递,然后使用它。像这样(用伪代码):

class ActivityScopedModule {

   ActivityScopedModule(Activity: activity) {
       this.activity = activity;
   }

   CustomObject provideCustomObject() {
       return new CustomObject(this.activity);
   }

}

重要的是,必须从Activity.onCreate()实例化作用域的模块,在这里您可以找到有关创建匕首作用域的更多信息:http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/或在这三部分的系列文章中:https://android.jlelse.eu/dagger-2-part-i-basic-principles-graph-dependencies-scopes-3dfd032ccd82

另一种方法(更简单的方法)是使它成为dagger模块中的实例,而不是使用静态InjectedObjectFactory.forActivity(this),使其成为非静态类InjectedObjectFactory,使其成为new InjectedObjectFactory()然后从活动中调用myInjectedObjectFactory.forActivity(this)并将其传递给演示者。