使用依赖注入编译问题
Issue compiling with dependency injection
从 java 进行 Kotlin 转换时出错,此项目正在测试 Github Api 并在 recyclerview.I 中显示数据得到编译错误,我无法解决 Dagger2
,它在 Java
中工作,但是当转换为 Kotlin
时,我在运行时遇到编译错误。
似乎是将 api 方法注入视图模型
我已尝试跟踪错误然后清理并重建应用程序
我也尝试过使缓存无效并重新启动,但似乎从 Java 转换为 Kotlin 时出现错误。任何帮助,将不胜感激。
这是我的 class:
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)
}
}
我的组件class:
@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 cannot be
provided without an @Inject constructor or an @Provides-annotated
method. This type supports members injection but cannot be
implicitly provided.
public abstract repos.network.RepoRepository
repoRepository();
^
repos.network.RepoRepository is provided at
components.AppComponent.repoRepository() e: repos/di/components/AppComponent.java:19: error:
[Dagger/MissingBinding] repos.network.RepoRepository cannot be
provided without an @Inject constructor or an @Provides- annotated
method. This type supports members injection but cannot be
implicitly provided.
^
repos.network.RepoRepository is injected at
repos.viewmodels.MainActivityListViewModel.ListViewModel(repoRepository)
repos.viewmodels.MainActivityListViewModel is injected at
repos.di.components.AppComponent.inject(repos.viewmodels.MainActivityListViewModel)
您的错误清楚地表明:
[Dagger/MissingBinding] repos.network.RepoRepository cannot be provided without an @Inject constructor or an @Provides-annotated method.
您没有为 RepoRepository 定义构造函数 class。
它应该看起来像这样:
class RepoRepository @Inject constructor(private val repoService: GithubRepos) {//the rest of your code here}
这也适用于您的视图模型 class。
如果您正在使用 android ViewModel 架构组件,我建议您阅读此 article,其中解释了如何将其与 Dagger2 一起使用。
希望这对您有所帮助。
从 java 进行 Kotlin 转换时出错,此项目正在测试 Github Api 并在 recyclerview.I 中显示数据得到编译错误,我无法解决 Dagger2
,它在 Java
中工作,但是当转换为 Kotlin
时,我在运行时遇到编译错误。
似乎是将 api 方法注入视图模型
我已尝试跟踪错误然后清理并重建应用程序
我也尝试过使缓存无效并重新启动,但似乎从 Java 转换为 Kotlin 时出现错误。任何帮助,将不胜感激。
这是我的 class:
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)
}
}
我的组件class:
@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 cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided. public abstract repos.network.RepoRepository repoRepository(); ^ repos.network.RepoRepository is provided at components.AppComponent.repoRepository() e: repos/di/components/AppComponent.java:19: error:
[Dagger/MissingBinding] repos.network.RepoRepository cannot be provided without an @Inject constructor or an @Provides- annotated method. This type supports members injection but cannot be
implicitly provided. ^ repos.network.RepoRepository is injected at repos.viewmodels.MainActivityListViewModel.ListViewModel(repoRepository) repos.viewmodels.MainActivityListViewModel is injected at repos.di.components.AppComponent.inject(repos.viewmodels.MainActivityListViewModel)
您的错误清楚地表明:
[Dagger/MissingBinding] repos.network.RepoRepository cannot be provided without an @Inject constructor or an @Provides-annotated method.
您没有为 RepoRepository 定义构造函数 class。
它应该看起来像这样:
class RepoRepository @Inject constructor(private val repoService: GithubRepos) {//the rest of your code here}
这也适用于您的视图模型 class。 如果您正在使用 android ViewModel 架构组件,我建议您阅读此 article,其中解释了如何将其与 Dagger2 一起使用。
希望这对您有所帮助。