在两种不同风格之间共享一个 Dagger 2 组件

Share a Dagger 2 component between two different flavors

我有两种口味:专业版和免费版。在每一个中,我都有一个 MainActivity,但我希望 MainComponentMainModule 对两者相同,所以 MainComponentMainModule 都在 src/java/main,但由于没有导入两种类型的 MainActivity,我的 MainComponent 中出现错误。在这里,让我说清楚:

这是 src/java/main 中的 MainComponent 的样子:

import com.xxx.myapp.di.modules.MainModule;
import com.xxx.myapp.free.MainActivity;
import com.xxx.myapp.presenters.MainPresenterImpl;

import javax.inject.Singleton;

import dagger.Component;


@Singleton
@Component(modules = {MainModule.class})
public interface MainComponent {
    void inject(MainActivity mainActivity);
    void inject(MainPresenterImpl mainPresenter);
}

在上面显示的代码中,它只从免费版中导入 MainActivity,因此在我切换到专业版时出现错误。

使用风味时,您不应该为不同的组件使用不同的包。

而不是com.xxx.myapp.free.MainActivity 将 MainActivity 上移到 com.xxx.myapp.MainActivity 两个版本的 MainActivity 必须具有相同的完全限定名称。

更新

您有两个名为 MainActivity 的 class,但对于 Java,它们具有不同的完全限定名称 com.xxx.myapp.free.MainActivitycom.xxx.myapp.pro.MainActivity(只是猜测)。

您真正需要的是 class com.xxx.myapp.MainActivity 具有特定风味的实现。您可以通过风味特定的文件夹路径为每种风味添加单独的 MainActivity 实现。

app/src/free/java/com/xxx/myapp/MainActivity.java app/src/pro/java/com/xxx/myapp/MainActivity.java

Gradle 只会编译所选风格的实现。

您可以使用 BuildConfig.FLAVOR 在运行时确定风格,然后您可以有选择地添加广告和不添加广告。我个人会这样做。