如果没有@Provides注释方法,则无法提供Dagger 2 LocalDataSource

时间:2017-03-31 07:14:32

标签: java android dependency-injection dagger-2 dagger

我试图通过使用DI创建存储库模式来跟随here中的相同示例。 问题是我收到以下错误:

  

"错误:(16,20)错误:@ mvp.model.di.scope.Local   无法提供mvp.model.repository.local.GameLocalDataSource   没有@ Provide-annotated方法。 @ mvp.model.di.scope.Local   注入mvp.model.repository.local.GameLocalDataSource   mvp.model.repository.GameRepository。(gameLocalDataSource,...)   mvp.model.repository.GameRepository在。提供   mvp.model.di.component.RepositoryComponent.getGameRepository()"

以下是与该应用相关的代码:

public class GameApplication extends Application {
private RepositoryComponent repositoryComponent;

@Override
public void onCreate() {
    super.onCreate();
    if (LeakCanary.isInAnalyzerProcess(this)) {
        // This process is dedicated to LeakCanary for heap analysis.
        // You should not init your app in this process.
        return;
    }
    LeakCanary.install(this);
    // Normal app init code...
    repositoryComponent = DaggerRepositoryComponent.builder()
            .applicationModule(new ApplicationModule((getApplicationContext())))
            .build();
}

public RepositoryComponent getRepositoryComponent() {
    return repositoryComponent;
}
}

这是我的RepositoryComponent

@Singleton
@Component(modules = {RepositoryModule.class, ApplicationModule.class})
public interface RepositoryComponent {
    GameRepository getGameRepository();
}

这里是RepositoryModule

    @Module
public class RepositoryModule {
    @Singleton
    @Provides
    @Local
    GameDataSource provideLocalDataSource(Context context) {
        return new GameLocalDataSource(context);
    }

    @Singleton
    @Provides
    @Remote
    GameDataSource provideRemoteDataSource() {
        return new GameRemoteDataSource();
    }
}

最后,ApplicationModule

    @Module
public final class ApplicationModule {
    private Context context;

    public ApplicationModule(Context context) {
        this.context = context;
    }

    @Provides
    Context providesContext() {
        return context;
    }
}

这是GameRepository课程的大部分内容:

@Singleton
public class GameRepository implements GameDataSource {
    private GameDataSource remoteDataSource;
    private GameDataSource localDataSource;

    @Inject
    public GameRepository(@Local GameLocalDataSource gameLocalDataSource, @Remote GameRemoteDataSource gameRemoteDataSource) {
        remoteDataSource = gameRemoteDataSource;
        localDataSource = gameLocalDataSource;
    }

此外,如上述示例所示,我创建了几个范围@Local@Remote,因为我的两个数据源具有相同的类型,而Dagger需要区分它们。

@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Local {

}

我与dagger相关的其余代码只是构造函数中的@Inject,我想要注入我的依赖项。 此外,DaggerRepositoryComponent类中永远不会生成GameApplication

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

  

如果没有@ Provide-annotated方法

,则无法提供GameLocalDataSource

您尝试@Inject GameLocalDataSource的代码中的某处,但您已在模块中指定了如何提供GameDataSource {{1} }。

GameLocalDataSource

要么让Dagger注入... GameDataSource provideLocalDataSource(Context context) { return new GameLocalDataSource(context); } ... ,要么向Dagger描述如何提供GameDataSource

GameLocalDataSource