[android]只有一个方法可以创建一个给定的子组件由 plus()

发布时间: 2017/3/19 17:47:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 Dagger 子组件被称为 UserComponent ,创建当用户在登录到该应用程序,下面我有列表的 Subcomponents (例如︰ FriendsComponent,ProfileComponent,HomeComponent...)。

想要的什么这是︰ 创建一个子组件被称为 ProfileComponent (根据 UserComponent),得到了两个模块 ProfileModulePostsModule :

                         MainComponent
                             |
                =============|======================
               |                                   |
                |                                   |
          UserComponent                      WelcomeComponent
                |
       =========|============                  
       |                     |    
    ProfileComponent       HomeComponent
       |
       |
  =====================
  |                  |
 PostsModule        ProfileModule   

(我希望这是可读)

因此,ProfileComponent 应包含︰

@UserScope
@Subcomponent(
       modules = {PostsModule.class, ProfileModule.class}
)
public interface ProfileComponent {

   void inject(PostsFragment postsFragment);
   void inject(ProfileActivity profileActivity);
}

这里是用户子组件

@UserScope
@Subcomponent(
       modules = UserModule.class
)
public interface UserComponent {

           HomeComponent plus(HomeModule homeModule);

           ProfileComponent plus(PostsModule postsModule);

           ProfileComponent plus(ProfileModule profileModule);
        }

在这里,在 PostsFragment 的注射

protected void setUpComponent(DragonBloodComponent component) {
       mApp.getApp(getActivity()).getUserComponent()
               .plus(new PostsModule())
               .inject(this);
   }

我得到这个错误

error: Only one method can create a given subcomponent..profile.ProfileComponent is created by: [plus(PostsModule), plus(ProfileModule)]

我要做这个吗?谢谢。

解决方法 1:

ProfileComponent plus(PostsModule postsModule);
ProfileComponent plus(ProfileModule profileModule);

这两个不兼容︰ 它看起来您想要创建 ProfileComponent,需要两个模块,但相反你提供两种不同的方式来创建一个,和没有它需要两个模块。Dagger发生之前,应通知您关于相互不兼容会发出警告,他们都不完整。

@Component 文档,"子组件"一节中描述的最简单的变化,是把它们放在相同的方法声明 (重点矿山)︰

子组件也可能通过工厂方法在父组件或子组件上声明。该方法可以具有任何名称,但必须返回子组件。工厂方法参数可能是任意数量的子组件的模块,但至少必须包括那些没有可见的无参数构造函数。

这会看起来像这样︰

ProfileComponent plus(PostsModule postsModule, ProfileModule profileModule);

建设者

作为替代方法,定义一个子组件生成器(参看组件生成器),可以聚合的模组,你需要。此子组件生成器可以然后注入你需要它,所以你不需要为了叫注入您的组件的地方 plus 方法。这还可以使您的代码可读性更好如果你需要很多更多的模块在你的子组件。

@UserScope
@Subcomponent(
       modules = {PostsModule.class, ProfileModule.class}
)
public interface ProfileComponent {

   void inject(PostsFragment postsFragment);
   void inject(ProfileActivity profileActivity);

   /**
    * With this you can inject a ProfileComponent.Builder from within
    * the classes that UserComponent provides, or expose it on your enclosing 
    * (sub)component if you'd like. Dagger writes the implementation.
    *
    * Of course, you can skip Modules with zero-arg constructors, because Dagger
    * doesn't need to be provided an instance of those.
    */
   @Subcomponent.Builder interface Builder {
       Builder postsModule(PostsModule postsModule);
       Builder profileModule(ProfileModule profileModule);
       ProfileComponent build();
   }
}

消耗︰

@Inject ProfileComponent.Builder profileComponentBuilder;
ProfileComponent profileComponent = profileComponentBuilder
    .postsModule(yourPostsModule)
    .profileModule(yourProfileModule)
    .build();
官方微信
官方QQ群
31647020