作者:美甲控Alily | 来源:互联网 | 2023-01-20 08:10
我从此文档https://google.github.io/dagger/api/latest/dagger/Component.html中读取了它们之间的区别,SubComponents
并且也阅读了此线程Dagger 2子组件与组件依赖关系Component Dependencies
有人可以帮我举例说明这句话的意思。
子组件可以使用由其祖先组件和子组件定义的任何绑定。作为替代,组件可以通过声明组件依赖性来仅使用来自另一个组件接口的绑定。将类型用作组件依赖项时,依赖项上的每个提供方法都将绑定为提供程序。请注意,只有暴露为供应方法的绑定才可以通过组件依赖项获得。
David Medenj..
7
可以将其视为类似于java的子组件SubComponent extends ParentComponent
,其中所有组件都位于其中protected
。它可以访问与父级相同的成员,并且只能使用父级的所有内容。
另一方面,组件依赖项就像一个委托对象,在这里您只能访问该类公开的公共方法。
让我们假设Dagger可以创建和提供2个类。不管是什么。不管您使用构造函数注入还是从模块创建对象都没有关系...我们仅假设我们拥有some可以提供的那两个类,BaseComponent
我将在下面显示。
// some module can create either object
class ComponentPrivateObject {}
class ExposedObject {}
它们来自哪里都无所谓。下一部分是有趣的部分。我们在组件接口的方法上将这些类之一声明为返回类型。这就是Dagger所谓的Provision方法。它说该组件可以提供该类。
@Component(modules=/* some modules */)
class BaseComponent {
// BaseComponent can provide ExposedObject!
ExposedObject exposedObject();
}
子组件和依赖组件之间的区别在于,就像开始时的Java示例一样,它们Subcomponent
将可以访问这两个组件,ComponentPrivateObject
并且ExposedObject
因为它只是扩展了父图。
// can use either class, it just adds to the parent
@Subcomponent
class Subcomponent {}
另一方面,DependentComponent
只能访问ExposedObject
。它不会扩展的图形BaseComponent
,而只是BaseComponent
作为某些对象的提供者进行绑定。就像上面的Java示例一样,它就像使用其公共API,如果您尝试使用ComponentPrivateObject
Dagger,则会告诉您无法提供它。
// binds component dependency as provider
@Component(dependency=BaseComponent.class)
class DependentComponent{}
一个扩展父级,另一个使用其公共API。
1> David Medenj..:
可以将其视为类似于java的子组件SubComponent extends ParentComponent
,其中所有组件都位于其中protected
。它可以访问与父级相同的成员,并且只能使用父级的所有内容。
另一方面,组件依赖项就像一个委托对象,在这里您只能访问该类公开的公共方法。
让我们假设Dagger可以创建和提供2个类。不管是什么。不管您使用构造函数注入还是从模块创建对象都没有关系...我们仅假设我们拥有some可以提供的那两个类,BaseComponent
我将在下面显示。
// some module can create either object
class ComponentPrivateObject {}
class ExposedObject {}
它们来自哪里都无所谓。下一部分是有趣的部分。我们在组件接口的方法上将这些类之一声明为返回类型。这就是Dagger所谓的Provision方法。它说该组件可以提供该类。
@Component(modules=/* some modules */)
class BaseComponent {
// BaseComponent can provide ExposedObject!
ExposedObject exposedObject();
}
子组件和依赖组件之间的区别在于,就像开始时的Java示例一样,它们Subcomponent
将可以访问这两个组件,ComponentPrivateObject
并且ExposedObject
因为它只是扩展了父图。
// can use either class, it just adds to the parent
@Subcomponent
class Subcomponent {}
另一方面,DependentComponent
只能访问ExposedObject
。它不会扩展的图形BaseComponent
,而只是BaseComponent
作为某些对象的提供者进行绑定。就像上面的Java示例一样,它就像使用其公共API,如果您尝试使用ComponentPrivateObject
Dagger,则会告诉您无法提供它。
// binds component dependency as provider
@Component(dependency=BaseComponent.class)
class DependentComponent{}
一个扩展父级,另一个使用其公共API。
请不要“将其视为像Java SubComponent这样的子组件扩展了ParentComponent”。组件和子组件之间没有继承关系。而是将它们视为内部类(它们是通过这种方式实现的),因为您可以从封闭的组件访问所有内容。