我试图通过使用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
。
非常感谢您的帮助!
答案 0 :(得分:2)
如果没有@ Provide-annotated方法
,则无法提供GameLocalDataSource
您尝试@Inject
GameLocalDataSource
的代码中的某处,但您已在模块中指定了如何提供GameDataSource
,不 {{1} }。
GameLocalDataSource
要么让Dagger注入...
GameDataSource provideLocalDataSource(Context context) {
return new GameLocalDataSource(context);
}
...
,要么向Dagger描述如何提供GameDataSource
。
GameLocalDataSource