繁体   English   中英

Dagger 2 Android:注入范围活动

[英]Dagger 2 Android: inject the scoped activity

我正在使用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();
}

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

MyClass.java

@ActivityScoped
public class MyClass {

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

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

我尝试了什么:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM