14

我正在使用方法为 Dagger 提供模块,在这个问题Android Customize Workflow for Product Flavors的回答中描述

我们的方法有点不同——我们有构建类型 inModules和构建类型 in 。我们的主要模块被称为它包括所有其他。debugsrc/debug/javareleasesrc/release/javaApplicationModule

Modulesinsrc/debug/java为调试、日志记录等和覆盖提供了一些自定义行为ApplcationModule

现在我们需要有基于应用程序风格的自定义行为。

这样做的正确方法是什么?

例如,风味 A 到 C 应该提供自定义行为,而风味 D 到 F 应该提供基本的默认行为。

到目前为止,我想出了这样的。

  • 所有口味(不是构建类型)在src/flavorX/java/com.application.FlavorModule
  • 为了避免代码重复,只有风味 A 到 C 提供自定义行为,而其他完全空的,以便项目可以编译。我的模块提供了默认行为src/main/java

有没有更好的方法来达到这样的结果?因为我不喜欢空src/flavorX/java/com.application.FlavorModule,也不喜欢重复代码……

4

2 回答 2

17

有点复杂,但我是这样做的:

创建一个接口 MainComponent 并将其保存在 src/main 中,这应该包含任何不特定于风味的内容

public interface MainComponent {
    void inject(MyApplication o);

    void inject(BusinessObject o);

    Foo getFoo();

    Activitycomponent plusActivityComponent(ActivityModule activityModule);

}

在每种风格中创建一个继承自上述风格的接口

public interface FlavorComponent extends MainComponent {
//flavor specific injection stuff similar to SourceComponent
}

在 Debug/Beta/Release 中创建实际组件并扩展 FlavorComponent(为您提供所有风味特定的细节)。

@Singleton
 @Component(modules = {ApplicationModule.class, FlavorModule.class,
         BetaApplicationModule.class, AnotherModuleJustBecause.class})
public interface ApplicationComponent extends FlavorComponent {
     void inject(NYTApplication a);

 }

请注意,您还可以包含特定于风味的 FlavorModule,它在每种风味中可能不同,或者在包含在 Beta 中时不包含在 Release 中。

在 Debug/Beta/Release 中还包括一个 ComponentFactory,返回通用的 Flavor 组件接口

public class ComponentFactory {

public static final FlavorComponent getComponent(Application context) {
        return DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(context))
                .build();
    }

最后来自您的 Application 类调用:

ComponentFactory.getComponent(this).inject(this);

组件工厂将返回构建类型组件,它将扩展 Flavor 的组件。

于 2015-10-13T03:14:11.600 回答
0

我的解决方案是对上面引用的这篇文章的改编

我在 src/main 中有一个接口调用 ApplicationComponent:

    @Singleton
    @Component(modules = [

        FlavorModule::class,

        Anyothermoduleyouhave::class

    ])

    interface ApplicationComponent {}

现在,在每个风味文件夹中,您必须创建 2 个文件:

  1. FlavorModule(调用配置的抽象类)
  2. FlavorConfig(配置或您需要的任何特定风味代码)

顺便说一句:如果你没有任何源文件夹,你可以通过添加你的 gradle 文件来创建:

        java.srcDirs += ['src/main/kotlin', 'src/myFlavorCode/kotlin']

并创建 kotlin 文件夹

风味模块:

    @Module
    class FlavorModule {

        @[Provides Singleton]
        fun getConfig(config: MySpecificFlavor1Config): FlavorConfig

    }

风味配置

    class MySpecificFlavor1Config @Inject constructor() : FlavorConfig {
        override fun getMyValueThatImLookingFor() = "flavor 1 woooooow"
    }

对风味 2 执行相同操作

重要提示:要使这与 dagger 一起动态工作,请对 FlavorModule/FlavorConfig 类使用相同的包路径,例如包 br.com.main.config,这样 dagger 就会了解要使用哪个 FlavorModule

于 2020-10-07T18:02:25.487 回答