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.
的一个实例
我尝试了什么:
- @Binds 注释方法将
ActivityA
和 ActivityB
注入为 Activity
。这不起作用,因为 Dagger 不允许将多个实现绑定到相同的基类型。
- Map Multibindings 不符合我的需要:我不想让 MyClass 知道它被注入的 Activity。
也许我遗漏了什么,因为依赖注入很难设置。我如何使用 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
组件中,您应该可以重复它。
我在 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.
我尝试了什么:
- @Binds 注释方法将
ActivityA
和ActivityB
注入为Activity
。这不起作用,因为 Dagger 不允许将多个实现绑定到相同的基类型。 - Map Multibindings 不符合我的需要:我不想让 MyClass 知道它被注入的 Activity。
也许我遗漏了什么,因为依赖注入很难设置。我如何使用 Dagger Android 做到这一点?
@Binds annotated method to inject
ActivityA
andActivityB
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
组件中,您应该可以重复它。