带有导体控制器的匕首
Dagger with Conductor Controllers
我正在试验 Dagger 2 中的“new”Android 支持。
我想在 Dagger 中设置以下架构:
Application => Activity => Controller (Conductor)
(控制器基本上是一个由系统实例化的 View
。你可以把它想象成 Fragment
s 但没有 Dagger 注入支持)
对于每个级别,我都定义了一个依赖项:ApplicationDep
、ActivityDep
和 ControllerDep
。
- 我的
Controller
应该能够注入所有这些依赖项。
- 我的
Activity
应该能够注入 ApplicationDep
和 ActivityDep
- 我的
Application
应该只能注入ApplicationDep
除我的 Controller
外,一切正常。
我无法注入 ActivityDep
.
public class MyController extends Controller {
@Inject
ApplicationDependency applicationDependency;
//@Inject
//ActivityDependency activityDependency; // can not be provided
@Inject
ControllerDependency controllerDependency;
@NonNull @Override protected View onCreateView(@NonNull LayoutInflater layoutInflater, @NonNull ViewGroup viewGroup) {
ConductorInjection.inject(this);
return layoutInflater.inflate(R.layout.controller_main, viewGroup, false);
}
}
目前我的 ControllerBindingModule
绑定在我的 ApplicationComponent
上,但是这应该绑定在 Activity
上以便它也可以在 Controller
上使用.
我该怎么做?
@Singleton
@Component(modules = {
ApplicationModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class,
ConductorInjectionModule.class,
ControllerBindingModule.class
})
interface AppComponent extends AndroidInjector<App> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<App> {}
}
可以在 Github 上找到完整的代码。
谢谢。
听起来控制器是 activity 组件的子组件。
我看了一下你的GitHub,所以我改变了你的一些代码来回答。
首先,用于Activity
注射。
Controller
不是 Appcomponent
的子组件,所以它只需要 ActivityBindingModule
.
AppComponent.java
@Singleton
@Component(modules = {
AppModule.class
ActivityBindingModule.class,
AndroidSupportInjectionModule.class,
})
interface AppComponent {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<App> {}
}
同理,我们只需要在App
中实现HasActivityInjector
即可。
App.java
public class App extends Application implements HasActivityInjector {
@Inject protected DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent
.builder()
.create(this)
.inject(this);
}
}
因为我需要将 Controller
声明为 ActivityComponent
的子组件,
我在 Dagger documentation about injecting activity objects
中使用第 2 步和第 3 步
改变你的 ActivityBindingModule
ActivityBindingModule.java
@Module(subcomponents = {MainActivityComponent.class})
public abstract class ActivityBindingModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindYourActivityInjectorFactory(MainActivityComponent.Builder builder);
}
创建 ActivityComponent
.
MainActivityComponent.java
@Subcomponent(modules = {MainActivityModule.class})
@ActivityScope
public interface MainActivityComponent extends AndroidInjector<MainActivity>{
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
接下来,是时候将控制器设置为 activity组件的子组件了。
将 ControllerBindingModule.class
添加到 MainActivityComponent
。
@Subcomponent(modules = {MainActivityModule.class, ControllerBindingModule.class})
@ActivityScope
public interface MainActivityComponent extends AndroidInjector<MainActivity>{
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
并在 MainActivity
中实施 HasControllerInjector
。
MainActivity.java
public class MainActivity extends AppCompatActivity implements HasControllerInjector {
@Inject protected DispatchingAndroidInjector<Controller> dispatchingControllerInjector;
@Override
public DispatchingAndroidInjector<Controller> controllerInjector() {
return dispatchingControllerInjector;
}
无需更改其他文件,想做就做。
我正在试验 Dagger 2 中的“new”Android 支持。
我想在 Dagger 中设置以下架构:
Application => Activity => Controller (Conductor)
(控制器基本上是一个由系统实例化的 View
。你可以把它想象成 Fragment
s 但没有 Dagger 注入支持)
对于每个级别,我都定义了一个依赖项:ApplicationDep
、ActivityDep
和 ControllerDep
。
- 我的
Controller
应该能够注入所有这些依赖项。 - 我的
Activity
应该能够注入ApplicationDep
和ActivityDep
- 我的
Application
应该只能注入ApplicationDep
除我的 Controller
外,一切正常。
我无法注入 ActivityDep
.
public class MyController extends Controller {
@Inject
ApplicationDependency applicationDependency;
//@Inject
//ActivityDependency activityDependency; // can not be provided
@Inject
ControllerDependency controllerDependency;
@NonNull @Override protected View onCreateView(@NonNull LayoutInflater layoutInflater, @NonNull ViewGroup viewGroup) {
ConductorInjection.inject(this);
return layoutInflater.inflate(R.layout.controller_main, viewGroup, false);
}
}
目前我的 ControllerBindingModule
绑定在我的 ApplicationComponent
上,但是这应该绑定在 Activity
上以便它也可以在 Controller
上使用.
我该怎么做?
@Singleton
@Component(modules = {
ApplicationModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class,
ConductorInjectionModule.class,
ControllerBindingModule.class
})
interface AppComponent extends AndroidInjector<App> {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<App> {}
}
可以在 Github 上找到完整的代码。
谢谢。
听起来控制器是 activity 组件的子组件。
我看了一下你的GitHub,所以我改变了你的一些代码来回答。
首先,用于Activity
注射。
Controller
不是 Appcomponent
的子组件,所以它只需要 ActivityBindingModule
.
AppComponent.java
@Singleton
@Component(modules = {
AppModule.class
ActivityBindingModule.class,
AndroidSupportInjectionModule.class,
})
interface AppComponent {
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<App> {}
}
同理,我们只需要在App
中实现HasActivityInjector
即可。
App.java
public class App extends Application implements HasActivityInjector {
@Inject protected DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent
.builder()
.create(this)
.inject(this);
}
}
因为我需要将 Controller
声明为 ActivityComponent
的子组件,
我在 Dagger documentation about injecting activity objects
改变你的 ActivityBindingModule
ActivityBindingModule.java
@Module(subcomponents = {MainActivityComponent.class})
public abstract class ActivityBindingModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindYourActivityInjectorFactory(MainActivityComponent.Builder builder);
}
创建 ActivityComponent
.
MainActivityComponent.java
@Subcomponent(modules = {MainActivityModule.class})
@ActivityScope
public interface MainActivityComponent extends AndroidInjector<MainActivity>{
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
接下来,是时候将控制器设置为 activity组件的子组件了。
将 ControllerBindingModule.class
添加到 MainActivityComponent
。
@Subcomponent(modules = {MainActivityModule.class, ControllerBindingModule.class})
@ActivityScope
public interface MainActivityComponent extends AndroidInjector<MainActivity>{
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}
并在 MainActivity
中实施 HasControllerInjector
。
MainActivity.java
public class MainActivity extends AppCompatActivity implements HasControllerInjector {
@Inject protected DispatchingAndroidInjector<Controller> dispatchingControllerInjector;
@Override
public DispatchingAndroidInjector<Controller> controllerInjector() {
return dispatchingControllerInjector;
}
无需更改其他文件,想做就做。