使用依赖项注入进行编译时发生问题

时间:2019-07-24 02:23:34

标签: kotlin dagger-2

从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)

1 个答案:

答案 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中使用它。

希望这会有所帮助。