1

我的项目结构如下所示

+ src
        + main // this is my common code
            + java 
                - LoginScreen // depending on condition launch screen from flavor1 or flavor2 
            + res
        + flavor1
            + java
            + res
        + flavor2
            + java
            + res

根据条件,我在main/src中有登录类,必须从flavor1 或flavor2 启动屏幕。

例如:

class LoginScreen{
......

    if(true){
        // launch ScreenUser from Flavor1 reset of screen flows from falvour1
    }else{
       // launch ScreenOTP from Flavor2 reset of screen flows from falvour2
    }
}

在这种情况下,如果我为flavor1 构建它会显示falvor2 类的错误,反之亦然。

两种风格都有不同的 applicationId,如applicationIdSuffix ".flavor1"

这可能吗?如果没有,我怎么能做到这一点?

4

2 回答 2

5

当我完成这种事情时,我使用了接口和依赖注入(我使用dagger)。就像是:

public interface LoginBehaviour {

    void goToNextScreen(Context context);
}

然后在每种风格中定义一个实现,其中包含启动下一个屏幕的代码。就像是:

public class FlavourOneLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenUser.class));
    }

}

和:

public class FlavourTwoLoginBehaviour implements LoginBehaviour {

    @Override
    public void goToNextScreen(Context context) {
        context.startActivity(new Intent(context, ScreenOTP.class));
    }

}

您需要在每种风格中设置依赖注入容器,以便它引用本地实现(这将取决于您使用的框架)。完成后,您可以使用主项目中的容器在运行时获取 LoginBehaviour 接口的正确实现,并且可以在其上调用 goToNextScreen 进行导航。依赖注入是一种非常方便的方法,可以确保您可以交换部分代码而无需进行重大重构,并且在重用和灵活性方面有很大帮助。希望有帮助!

于 2017-01-05T11:51:41.833 回答
1

一种可能的方法是,如果您只想使用一个类if来检查您的 buildType/productFlavor - 您可以BuildConfig通过添加以下内容来设置 buildTypes/productFlavors 中的字段值:

productFlavors {
  flavor1 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor1"
  }
  flavor2 {
    buildConfigField "String", "BUILD_FLAVOR", "Flavor2"
  }
}

然后你可以在代码中使用它:

class LoginScreen {
......

  switch(BuildConfig.BUILD_FLAVOR) {
    case "Flavor1":
      // launch ScreenUser from Flavor1
      break;
    case "Flavor2":
      // launch ScreenOTP from Flavor2
      break;
  }
}

希望,我有帮助。祝你好运!

于 2017-01-05T11:31:06.267 回答