在您的特定情况下,您会丢失:
@Binds Application bindApplication(App app);
这很重要,因为dagger.android将自动包含对特定Application,Activity,Fragment,Service,BroadcastReceiver等子类 的绑定 , 但不包含对一般对象 的绑定。(您可以注入 App 而不注入 Application ,并注入 YourActivity 而不注入 Activity 。)如果要指示dagger.android使用应用程序实例应满足对Application的请求,则必须包含上述绑定。
一般而言,对于Application,Activity,Service和BroadcastReceiver而言,这是一件相当安全的事情,但对于Fragment(本机或在compat库中)而言则不是。这是因为dagger.android尊重嵌套片段,在这种情况下,要插入哪个片段将是模棱两可的。
尽管您可以通过luffy的答案中的Module和instance字段提供Application ,但这比您需要的样板好,而且优化程度也较低:Dagger将编写代码来调用您的@Provides
方法,而您可以声明性地告诉Dagger重用现有的代码使用@Binds
或编写static @Provides
避免在实例上调用调用的方法进行绑定。