Android [Koin]:实例创建错误:无法为创建实例

Android [Koin]:实例创建错误:无法为创建实例,android,kotlin,mvvm,retrofit,koin,Android,Kotlin,Mvvm,Retrofit,Koin,我是Koin的新手,长期以来一直在犯这个错误。在emulator上运行代码时发现此错误。我不知道怎么解决这个问题。那么,有人有什么建议吗 E/[Koin]: Instance creation error : could not create instance for [Factory:'com.example.findgithubretrofit2rx.ui.SearchViewModel']: org.koin.core.error.NoBeanDefFoundException: No d

我是Koin的新手,长期以来一直在犯这个错误。在emulator上运行代码时发现此错误。我不知道怎么解决这个问题。那么,有人有什么建议吗

E/[Koin]: Instance creation error : could not create instance for [Factory:'com.example.findgithubretrofit2rx.ui.SearchViewModel']: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'com.example.findgithubretrofit2rx.data.UserImpl'. Check your definitions!
        org.koin.core.scope.Scope.throwDefinitionNotFound(Scope.kt:246)
        org.koin.core.scope.Scope.resolveInstance(Scope.kt:216)
        org.koin.core.scope.Scope.get(Scope.kt:181)
        com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Modules.kt:19)
        com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Unknown Source:4)
        org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)
        org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)
        org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)
        org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)
        org.koin.core.scope.Scope.get(Scope.kt:181)
        org.koin.androidx.viewmodel.ViewModelFactoryKt$defaultViewModelFactory$1.create(ViewModelFactory.kt:50)
        androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
        androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        org.koin.androidx.viewmodel.ViewModelResolutionKt.get(ViewModelResolution.kt:21)
        org.koin.androidx.viewmodel.ViewModelResolutionKt.resolveInstance(ViewModelResolution.kt:10)
        org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:70)
        org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:56)
        org.koin.androidx.viewmodel.koin.KoinExtKt.getViewModel(KoinExt.kt:34)
        org.koin.androidx.viewmodel.ext.android.ViewModelStoreOwnerExtKt.getViewModel(ViewModelStoreOwnerExt.kt:60)
        com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(ViewModelStoreOwnerExt.kt:45)
        com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(Unknown Source:0)
        kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
        com.example.findgithubretrofit2rx.ui.SearchFragment.getVm(Unknown Source:2)
        com.example.findgithubretrofit2rx.ui.SearchFragment.observeLiveDate(SearchFragment.kt:45)
        com.example.findgithubretrofit2rx.ui.SearchFragment.onViewCreated(SearchFragment.kt:41)
        androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322)
        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
        android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)
        android.app.Activity.performStart(Activity.java:7029)
        android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)
        android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        android.app.ActivityThread.-wrap11(Unknown Source:0)
        android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        android.os.Handler.dispatchMessage(Handler.java:106)
        android.os.Looper.loop(Looper.java:164)
        android.app.ActivityThread.main(ActivityThread.java:6494)
        java.lang.reflect.Method.invoke(Native Method)
        com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.findgithubretrofit2rx, PID: 30918
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.findgithubretrofit2rx/com.example.findgithubretrofit2rx.ui.MainActivity}: org.koin.core.error.InstanceCreationException: Could not create instance for [Factory:'com.example.findgithubretrofit2rx.ui.SearchViewModel']
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [Factory:'com.example.findgithubretrofit2rx.ui.SearchViewModel']
        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:59)
        at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)
        at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)
        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)
        at org.koin.core.scope.Scope.get(Scope.kt:181)
        at org.koin.androidx.viewmodel.ViewModelFactoryKt$defaultViewModelFactory$1.create(ViewModelFactory.kt:50)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at org.koin.androidx.viewmodel.ViewModelResolutionKt.get(ViewModelResolution.kt:21)
        at org.koin.androidx.viewmodel.ViewModelResolutionKt.resolveInstance(ViewModelResolution.kt:10)
        at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:70)
        at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:56)
        at org.koin.androidx.viewmodel.koin.KoinExtKt.getViewModel(KoinExt.kt:34)
        at org.koin.androidx.viewmodel.ext.android.ViewModelStoreOwnerExtKt.getViewModel(ViewModelStoreOwnerExt.kt:60)
        at com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(ViewModelStoreOwnerExt.kt:45)
        at com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(Unknown Source:0)
        at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
        at com.example.findgithubretrofit2rx.ui.SearchFragment.getVm(Unknown Source:2)
        at com.example.findgithubretrofit2rx.ui.SearchFragment.observeLiveDate(SearchFragment.kt:45)
        at com.example.findgithubretrofit2rx.ui.SearchFragment.onViewCreated(SearchFragment.kt:41)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)
        at android.app.Activity.performStart(Activity.java:7029)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
E/AndroidRuntime: Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'com.example.findgithubretrofit2rx.data.UserImpl'. Check your definitions!
        at org.koin.core.scope.Scope.throwDefinitionNotFound(Scope.kt:246)
        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:216)
        at org.koin.core.scope.Scope.get(Scope.kt:181)
        at com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Modules.kt:19)
        at com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Unknown Source:4)
        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)
            ... 41 more
这里有一些类,我认为是它们导致了错误。 SearchFragment.kt、SearchViewModel.kt、UserImpl.kt、ReformationBuilder.kt

class SearchFragment : Fragment() {

    private val vm: SearchViewModel by viewModel()
    .....
    .......

class SearchViewModel(private val userImpl: UserImpl) : ViewModel() {

    private val disposable = CompositeDisposable()
    ....
    ......

class UserImpl(private val gitHubApi: GitHubApi) : UserRepository {

    override fun getSearchUser(str: String?): Observable<SearchUserResponse> {
        return gitHubApi.searchUsers(str)
    }
}

interface UserRepository {

    fun getSearchUser(str: String?): Observable<SearchUserResponse>
}

class RetrofitBuilder(val okHttpClient: OkHttpClient,
                      val converterFactory: Converter.Factory,
                      val adapterFactory: CallAdapter.Factory) {

    inline fun <reified T> build(baseUrl: String): T {
        return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl(baseUrl)
            .addConverterFactory(converterFactory)
            .addCallAdapterFactory(adapterFactory)
            .build()
            .create(T::class.java)
    }
}
class SearchFragment:Fragment(){
private val vm:SearchViewModel by viewModel()
.....
.......
类SearchViewModel(private val userImpl:userImpl):ViewModel(){
private val disposable=CompositeDisposable()
....
......
类UserImpl(私有val gitHubApi:gitHubApi):UserRepository{
覆盖有趣的getSearchUser(str:String?):可观察{
返回gitHubApi.searchUsers(str)
}
}
接口用户存储库{
有趣的getSearchUser(str:String?):可观察
}
类生成器(val okHttpClient:okHttpClient,
val转换器工厂:转换器工厂,
val适配器工厂:CallAdapter.Factory){
内联有趣构建(baseUrl:String):T{
return reformation.Builder()
.客户(okHttpClient)
.baseUrl(baseUrl)
.addConverterFactory(converterFactory)
.addCallAdapterFactory(adapterFactory)
.build()
.create(T::class.java)
}
}
这是我的模块

val appModule = module {

    factory<UserRepository> { UserImpl(get()) }

    viewModel { SearchViewModel(get())}
}

val networkModule = module {
    single {
        HttpLoggingInterceptor().apply {
            this.level = HttpLoggingInterceptor.Level.BODY
        }
    }

    single {
        object : Interceptor {
            @Throws(IOException::class)
            override fun intercept(chain: Interceptor.Chain): Response {
                val original: Request = chain.request()
                val originalHttpUrl = original.url
                val url = originalHttpUrl.newBuilder()
                    .build()

                // Request customization: add request headers
                val requestBuilder = original.newBuilder().url(url)
                val request = requestBuilder.build()
                val response = chain.proceed(request)
                return response
            }
        }
    }

    single {
        OkHttpClient.Builder()
            .addInterceptor(get<HttpLoggingInterceptor>())
            .addInterceptor(get<Interceptor>())
            .build()
    }

    single<CallAdapter.Factory> { RxJava2CallAdapterFactory.create() }

    single<Converter.Factory> { GsonConverterFactory.create() }

    single { RetrofitBuilder(get(), get(), get()) }

    single<GitHubApi> { get<RetrofitBuilder>().build(GITHUB_BASE_URL) }
}

val appModule=模块{
工厂{UserImpl(get())}
viewModel{SearchViewModel(get())}
}
val网络模块=模块{
单身{
HttpLoggingInterceptor().apply{
this.level=HttpLoggingInterceptor.level.BODY
}
}
单身{
对象:拦截器{
@抛出(IOException::类)
覆盖有趣的拦截(链:Interceptor.chain):响应{
val original:Request=chain.Request()
val originalHttpUrl=original.url
val url=originalHttpUrl.newBuilder()
.build()
//请求自定义:添加请求头
val requestBuilder=original.newBuilder().url(url)
val request=requestBuilder.build()
val响应=链。继续(请求)
返回响应
}
}
}
单身{
OkHttpClient.Builder()
.addInterceptor(get())
.addInterceptor(get())
.build()
}
单个{RxJava2CallAdapterFactory.create()}
单个{GsonConverterFactory.create()}
单个{builder(get(),get(),get())}
单个{get().build(GITHUB\u BASE\u URL)}
}

我认为问题出在名字上

您正在为
UserRepository

val appModule = module {

    factory<UserRepository> { UserImpl(get()) }

    viewModel { SearchViewModel(get())}
}
Koin需要知道您正在添加的相同参数,即使它是一个接口。但正如许多网站建议使用抽象而不是实现来构建软件,因此请记住:)。您应该在viewModel中添加
UserRepository
接口

class SearchViewModel(private val userRepository: UserRepository)

我认为问题在于名字上的问题

您正在为
UserRepository

val appModule = module {

    factory<UserRepository> { UserImpl(get()) }

    viewModel { SearchViewModel(get())}
}
Koin需要知道您正在添加的相同参数,即使它是一个接口。但正如许多网站建议使用抽象而不是实现来构建软件,因此请记住:)。您应该在viewModel中添加
UserRepository
接口

class SearchViewModel(private val userRepository: UserRepository)

仍然存在相同的错误。请尝试清理项目并重新运行。如果问题仍然存在,可以执行以下操作“viewModel{SearchViewModel(get())}”,添加UserRepository上下文。并确保您在koin模块中设置了正确的接口/类。同时确保您正在加载'appModule'和'networkModule',但仍然存在相同的错误。尝试清理项目并再次运行。如果问题仍然存在,您可以执行此操作“viewModel{SearchViewModel(get())”,添加UserRepository上下文。并确保在koin模块中设置了正确的接口/类。同时确保正在加载“appModule”和“networkModule”