我的项目结构如下所示
+ 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 中有Login类,具体取决于条件,必须从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”
这可能吗?如果不是我怎么能实现这个目标?
答案 0 :(得分:3)
当我完成这类事情时,我使用了接口和依赖注入(我使用dagger)。类似的东西:
public interface LoginBehaviour {
void goToNextScreen(Context context);
}
然后在每个flavor中定义一个实现,其中包含启动下一个屏幕的代码。类似的东西:
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));
}
}
您需要在每个flavor中设置依赖注入容器,以便它引用本地实现(这将根据您使用的框架而有所不同)。完成之后,您可以使用主项目中的容器在运行时获取LoginBehaviour接口的正确实现,并且可以在其上调用goToNextScreen来进行导航。依赖注入是一种非常方便的方法,可以确保您可以在不进行重大重构的情况下交换部分代码,并且可以在重用和灵活性方面提供很多帮助。希望有所帮助!
答案 1 :(得分:1)
执行此操作的可能性之一,如果您只想使用if
检查buildType / productFlavor的类,则可以在buildTypes / productFlavors中设置BuildConfig
字段的值添加:
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;
}
}
希望,我帮了。祝你好运!