我将我的应用程序从Dagger1.0转换为dagger2.0,并且有一个带有许多void inject(活动/片段/接收器/ etc对象)方法的app组件.@H_301_2@
使用dagger 1.0我只能做objectGraph.inject(Object对象),但现在我的组件必须为每个接受注入依赖关系的类提供一个方法.@H_301_2@
为什么我不能只拥有一个具有一种方法的组件:< T>空穴注入(T t); ?@H_301_2@
以供参考:
我的组件现在:@H_301_2@
@H_301_2@
public interface AppComponent {
void inject(MyFirstActivity activity);
void inject(MySecondActivity activity);
void inject(MyFirstFragment fragment);
void inject(MySecondFragment fragment);
...
}
我想要的组件:@H_301_2@
@H_301_2@
public interface AppComponent {
最佳答案
Why can’t I just have a component that has one method:
?@H_301_2@
因为dagger-2使用代码生成并且需要在编译时知道类型信息.没有它,就没有办法分辨出T需要哪些依赖 – 因此代码生成是不可能的.@H_301_2@
如果编译第一个组件并检查生成的Dagger * Component源代码,您将看到每个注入方法都有自己的工厂方法,为给定类型提供所有依赖项.@H_301_2@
注入子类也是如此.您可以在组件文档中查看段落A note about covariance.因为超类类型是已知的,所以dagger可以在超类中注入成员,但它不会注入潜在子类型的成员.同样,因为dagger-2依赖于编译时代码生成,所以这是不可能的.