Dagger 2 Android:注入范围内的活动

时间:2017-09-28 20:38:58

标签: android dagger-2 dagger

我正在使用Dagger Android链接Android应用程序中的依赖项。 我有2个活动,都有自己的范围(@ActivityScoped)。 到目前为止,这是我的代码:

MyApplication.java

public class MyApplication extends Application implements HasActivityInjector {
    @Inject DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;

    @Override
    public void onCreate() {
        super.onCreate();

        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this);
    }

    @Override
    public AndroidInjector<Activity> activityInjector() {
        return activityDispatchingAndroidInjector;
    }
}

AppComponent.java

@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        ActivityBindingModule.class
})
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application app);

        AppComponent build();
    }

    void inject(MyApplication app);
}

ActivityBindingsModule.java

@Module(subcomponents = ActivityComponent.class)
public abstract class ActivityBindingModule {

    @ActivityScoped
    @ContributesAndroidInjector
    public abstract MainActivity contributeMainActivityInjector();

    @ActivityScoped
    @ContributesAndroidInjector
    public abstract SecondActivity contributeSecondActivityInjector();
}

假设我有一个与ActivityScoped绑定的类MyClass,我想将其注入到两个活动中:

MyClass.java

@ActivityScoped
public class MyClass {

    @Inject
    public MyClass(Activity activity) {
        // Do something with the activity instance...
    }
}

我想要实现的是向封闭范围的Activity实例注入MyClass。 例如,如果将MyClass注入到ActivityA中,那么MyClass的activity构造函数参数应该是ActivityA的一个实例。

我尝试了什么:

  • @绑定注释方法以将ActivityAActivityB注入Activity。这不起作用,因为Dagger不允许将多个实现绑定到相同的基类型。
  • Map Multibindings不符合我的需要:我不希望MyClass知道它被注入的Activity。

也许我错过了一些东西,因为依赖注入很难设置。我怎么能用Dagger Android做到这一点?

1 个答案:

答案 0 :(得分:1)

  

@绑定注释方法以将ActivityAActivityB注入活动。这不起作用,因为Dagger不允许将多个实现绑定到相同的基类型。

这是正确的方法。当您尝试将多个实现绑定到同一组件中的相同类型 时,只会出现错误。因此,您不应该在AppComponent内绑定,而应绑定到@ActivityScoped子组件。

您必须为每个活动A和B创建一个模块,该模块将实施绑定到Activity。然后,您只需将该模块添加到Dagger为您创建的子组件中。

@ActivityScoped
@ContributesAndroidInjector(modules={MainActivityBindingsModule.class})
public abstract MainActivity contributeMainActivityInjector();

这样绑定只存在于@ActivityScoped组件中,您应该可以重复它。