从文档:
使用
@Module.subcomponents
更好,因为它允许 Dagger 检测是否曾经请求过子组件。通过父组件上的方法安装子组件是对该组件的显式请求,即使该方法从未被调用。Dagger 无法检测到这一点,因此即使您从不使用它也必须生成子组件。
有谁明白这到底是什么意思?
从文档:
使用
@Module.subcomponents
更好,因为它允许 Dagger 检测是否曾经请求过子组件。通过父组件上的方法安装子组件是对该组件的显式请求,即使该方法从未被调用。Dagger 无法检测到这一点,因此即使您从不使用它也必须生成子组件。
有谁明白这到底是什么意思?
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 正在将其删除。如果您在知道自己需要子组件之前避免编译子组件,那么在大型项目中效率会高得多,这就是 Module.subcomponents 所支持的。