Dagger 2 Android:注入作用域 activity

Dagger 2 Android: inject the scoped activity

我在 Android 应用程序中使用 Dagger Android 到 link 依赖项。 我有 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();
}

假设我有一个 class 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.

的一个实例

我尝试了什么:

也许我遗漏了什么,因为依赖注入很难设置。我如何使用 Dagger Android 做到这一点?

@Binds annotated method to inject ActivityA and ActivityB as Activity. This doesn't work since Dagger does not allow binding multiple implementations to the same base type.

这才是正确的做法。仅当您尝试将多个实现绑定到同一组件 中的同一类型 时,才会出现错误。所以你不应该在你的 AppComponent 中绑定两者,而是绑定到 @ActivityScoped 子组件。

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

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

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