从Java进行Kotlin转换时出现错误,该项目正在测试Github Api并在recyclerview中显示数据。我收到一个编译错误,我无法为Dagger2
进行调试,它在Java
中有效,但是在转换时到Kotlin
时,在运行时出现编译错误。
似乎是在视图模型中注入api方法
我尝试按照错误进行操作,然后清理并重建应用程序
我也尝试过使缓存无效并重新启动,但是从Java转换为Kotlin时似乎出现了错误。任何帮助,将不胜感激。
这是我的课程:
class RepoRepository {
private lateinit var repoService: GithubRepos
@Inject
fun RepoRepository(repoService: GithubRepos) {
this.repoService = repoService
}
fun getRepositories(): Single<List<Repo>> {
return repoService.getRepos()
}
fun getSingleRepo(owner: String, name: String): Single<Repo> {
return repoService.getSingleRepo(owner, name)
}
}
我的组件类:
@Singleton
@Component(modules = arrayOf(NetworkModule::class))
interface AppComponent {
/**
* inject required dependencies into MainActivityListViewModel
*/
fun inject(mainActivityListViewModel: MainActivityListViewModel)
@Component.Builder
interface Builder {
fun build(): AppComponent
fun networkModule(networkModule: NetworkModule): Builder
}
}
还有我的ViewModel:
class MainActivityListViewModel : BaseViewModel() {
private lateinit var repoRepository: RepoRepository
private var disposable: CompositeDisposable? = null
private val repos = MutableLiveData<List<Repo>>()
private val repoLoadError = MutableLiveData<Boolean>()
private val loading = MutableLiveData<Boolean>()
@Inject
fun ListViewModel(repoRepository: RepoRepository) {
this.repoRepository = repoRepository
disposable = CompositeDisposable()
fetchRepos()
}
fun getRepos(): LiveData<List<Repo>> {
return repos
}
fun getError(): LiveData<Boolean> {
return repoLoadError
}
fun getLoading(): LiveData<Boolean> {
return loading
}
private fun fetchRepos() {
loading.value = true
disposable?.add(repoRepository.getRepositories()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object :
DisposableSingleObserver<List<Repo>>() {
override fun onSuccess(value: List<Repo>) {
repoLoadError.value = false
repos.value = value
loading.value = false
}
override fun onError(e: Throwable) {
repoLoadError.value = true
loading.value = false
}
}))
}
override fun onCleared() {
super.onCleared()
if (disposable != null) {
disposable!!.clear()
disposable = null
}
}
}
这是我得到的错误:
[Dagger / MissingBinding] repos.network.RepoRepository不能为 没有@Inject构造函数或@Provides注释的情况下提供 方法。此类型支持成员注入,但不能 隐式提供。 公共抽象repos.network.RepoRepository repoRepository(); ^ 在以下位置提供了repos.network.RepoRepository components.AppComponent.repoRepository()e:repos / di / components / AppComponent.java:19:错误:
[Dagger / MissingBinding] repos.network.RepoRepository不能为 提供时没有@Inject构造函数或@ Provides-注释 方法。此类型支持成员注入,但不能
隐式提供。 ^ repos.network.RepoRepository在以下位置注入 repos.viewmodels.MainActivityListViewModel.ListViewModel(repoRepository) repos.viewmodels.MainActivityListViewModel注入在 repos.di.components.AppComponent.inject(repos.viewmodels.MainActivityListViewModel)
答案 0 :(得分:2)
您的错误清楚地表明:
没有@Inject构造函数或@Provides注释的方法,将无法提供[Dagger / MissingBinding] repos.network.RepoRepository。
您没有为RepoRepository类定义构造函数。
它应该看起来像这样:
class RepoRepository @Inject constructor(private val repoService: GithubRepos) {//the rest of your code here}
这也适用于您的viewmodel类。 如果您使用的是Android ViewModel体系结构组件,建议您阅读此article,其中介绍了如何在Dagger2中使用它。
希望这会有所帮助。