来自docs:
使用
@Module.subcomponents
更好,因为它允许Dagger检测是否曾经请求子组件。通过方法在父组件上安装子组件是对该组件的显式请求,即使从未调用该方法也是如此。 Dagger无法检测到它,因此即使您从不使用它也必须生成子组件。
有人知道这到底是什么意思吗?
答案 0 :(得分:2)
Dagger不能告诉您是否曾经调用过任何组件方法:这是一个编译时框架,它生成组件实现,并且实现您放置在组件接口上的每个方法。
@Component(modules = YourModule.class)
public interface YourComponent {
ClassA a();
ClassB b();
ExplicitSubcomponent createExplicitSubcomponent(Dep1 dep1, Dep2 dep2);
}
@Module(subcomponents = ImplicitSubcomponent.class)
public abstract class YourModule {
@Binds ClassC classC(DefaultClassC classCImpl);
}
在上面的示例中,我们有ClassA,ClassB和ClassC。可以说,在所有这些中,您实际上只需要ClassA:它们实际上并不相互依赖,并且您实际上没有使用子组件。
b()
已定义,因此有人可能会在某天打电话要求ClassB。 Dagger无法了解是否有人调用b()
,因此它必须创建和引用ClassB以及ClassB传递依赖的所有内容的工厂实现。这说明了Dagger的哲学,即仅编译可从组件接口本身访问的内容。这也适用于子组件:
当然,如果您要使用Proguard或其他静态分析器修剪构建,则这些工具可能能够修剪不必要的类或方法。但是,此时您正在进行代码生成子组件的工作,正在进行将其编译为字节码的工作,然后Proguard正在进行将其删除的工作。如果您在知道自己需要子组件之前就避免编译子组件,那么在大型项目中效率会更高。