带有导体控制器的匕首

Dagger with Conductor Controllers

我正在试验 Dagger 2 中的“new”Android 支持。
我想在 Dagger 中设置以下架构:

Application => Activity => Controller (Conductor)

(控制器基本上是一个由系统实例化的 View。你可以把它想象成 Fragments 但没有 Dagger 注入支持)

对于每个级别,我都定义了一个依赖项:ApplicationDepActivityDepControllerDep

  1. 我的 Controller 应该能够注入所有这些依赖项。
  2. 我的 Activity 应该能够注入 ApplicationDepActivityDep
  3. 我的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;
}

无需更改其他文件,想做就做。