0

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

应用程序 => 活动 => 控制器(导体

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

对于每个级别,我都定义了一个依赖项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的. 我怎样才能做到这一点?ActivityController

@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上找到。
谢谢。

4

1 回答 1

2

听起来控制器是活动组件的子组件。
我看了你的 GitHub,所以我改变了你的一些代码来回答。

首先,用于Activity注射。
Controller不是 的子组件Appcomponent,所以它只需要ActivityBindingModule.

应用组件.java

@Singleton
@Component(modules = {
        AppModule.class
        ActivityBindingModule.class,
        AndroidSupportInjectionModule.class,
})
interface AppComponent {
    @Component.Builder
    abstract class Builder extends AndroidInjector.Builder<App> {}
}

同理,我们只需要实现HasActivityInjectorin 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 文档中关于注入活动对象的步骤 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> {}
}

接下来,是时候将控制器设置为活动组件的子组件了。
添加ControllerBindingModule.classMainActivityComponent.

@Subcomponent(modules = {MainActivityModule.class, ControllerBindingModule.class})
@ActivityScope
public interface MainActivityComponent extends AndroidInjector<MainActivity>{
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}

HasControllerInjectorMainActivity.

MainActivity.java

public class MainActivity extends AppCompatActivity implements HasControllerInjector {

    @Inject protected DispatchingAndroidInjector<Controller> dispatchingControllerInjector;

    @Override
    public DispatchingAndroidInjector<Controller> controllerInjector() {
        return dispatchingControllerInjector;
}

无需更改其他文件,您想要的就完成了。

于 2018-01-05T03:11:02.533 回答