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

Dou*_*leJ 2 android mvvm kotlin retrofit koin

我是 Koin 的新手,这个错误已经困扰我很长时间了。当我在模拟器上运行代码时发现此错误。我不知道如何解决这个问题。那么,有人有什么建议吗?

\n
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!\n        org.koin.core.scope.Scope.throwDefinitionNotFound(Scope.kt:246)\n        org.koin.core.scope.Scope.resolveInstance(Scope.kt:216)\n        org.koin.core.scope.Scope.get(Scope.kt:181)\n        com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Modules.kt:19)\n        com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Unknown Source:4)\n        org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)\n        org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)\n        org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)\n        org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)\n        org.koin.core.scope.Scope.get(Scope.kt:181)\n        org.koin.androidx.viewmodel.ViewModelFactoryKt$defaultViewModelFactory$1.create(ViewModelFactory.kt:50)\n        androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)\n        androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\n        org.koin.androidx.viewmodel.ViewModelResolutionKt.get(ViewModelResolution.kt:21)\n        org.koin.androidx.viewmodel.ViewModelResolutionKt.resolveInstance(ViewModelResolution.kt:10)\n        org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:70)\n        org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:56)\n        org.koin.androidx.viewmodel.koin.KoinExtKt.getViewModel(KoinExt.kt:34)\n        org.koin.androidx.viewmodel.ext.android.ViewModelStoreOwnerExtKt.getViewModel(ViewModelStoreOwnerExt.kt:60)\n        com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(ViewModelStoreOwnerExt.kt:45)\n        com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(Unknown Source:0)\n        kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)\n        com.example.findgithubretrofit2rx.ui.SearchFragment.getVm(Unknown Source:2)\n        com.example.findgithubretrofit2rx.ui.SearchFragment.observeLiveDate(SearchFragment.kt:45)\n        com.example.findgithubretrofit2rx.ui.SearchFragment.onViewCreated(SearchFragment.kt:41)\n        androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322)\n        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)\n        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)\n        androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)\n        androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)\n        androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)\n        androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)\n        androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)\n        androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)\n        androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)\n        android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)\n        android.app.Activity.performStart(Activity.java:7029)\n        android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)\n        android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)\n        android.app.ActivityThread.-wrap11(Unknown Source:0)\n        android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)\n        android.os.Handler.dispatchMessage(Handler.java:106)\n        android.os.Looper.loop(Looper.java:164)\n        android.app.ActivityThread.main(ActivityThread.java:6494)\n        java.lang.reflect.Method.invoke(Native Method)\n        com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)\n        com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)\nD/AndroidRuntime: Shutting down VM\nE/AndroidRuntime: FATAL EXCEPTION: main\n    Process: com.example.findgithubretrofit2rx, PID: 30918\n    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']\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)\n        at android.app.ActivityThread.-wrap11(Unknown Source:0)\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)\n        at android.os.Handler.dispatchMessage(Handler.java:106)\n        at android.os.Looper.loop(Looper.java:164)\n        at android.app.ActivityThread.main(ActivityThread.java:6494)\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)\n     Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [Factory:'com.example.findgithubretrofit2rx.ui.SearchViewModel']\n        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:59)\n        at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)\n        at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)\n        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)\n        at org.koin.core.scope.Scope.get(Scope.kt:181)\n        at org.koin.androidx.viewmodel.ViewModelFactoryKt$defaultViewModelFactory$1.create(ViewModelFactory.kt:50)\n        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)\n        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)\n        at org.koin.androidx.viewmodel.ViewModelResolutionKt.get(ViewModelResolution.kt:21)\n        at org.koin.androidx.viewmodel.ViewModelResolutionKt.resolveInstance(ViewModelResolution.kt:10)\n        at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:70)\n        at org.koin.androidx.viewmodel.scope.ScopeExtKt.getViewModel(ScopeExt.kt:56)\n        at org.koin.androidx.viewmodel.koin.KoinExtKt.getViewModel(KoinExt.kt:34)\n        at org.koin.androidx.viewmodel.ext.android.ViewModelStoreOwnerExtKt.getViewModel(ViewModelStoreOwnerExt.kt:60)\n        at com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(ViewModelStoreOwnerExt.kt:45)\n        at com.example.findgithubretrofit2rx.ui.SearchFragment$$special$$inlined$viewModel$1.invoke(Unknown Source:0)\n        at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)\n        at com.example.findgithubretrofit2rx.ui.SearchFragment.getVm(Unknown Source:2)\n        at com.example.findgithubretrofit2rx.ui.SearchFragment.observeLiveDate(SearchFragment.kt:45)\n        at com.example.findgithubretrofit2rx.ui.SearchFragment.onViewCreated(SearchFragment.kt:41)\n        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:322)\n        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)\n        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)\n        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)\n        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)\n        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)\n        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)\n        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)\n        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)\n        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)\n        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1334)\n        at android.app.Activity.performStart(Activity.java:7029)\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2741)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)\xc2\xa0\n        at android.app.ActivityThread.-wrap11(Unknown Source:0)\xc2\xa0\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)\xc2\xa0\n        at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n        at android.os.Looper.loop(Looper.java:164)\xc2\xa0\n        at android.app.ActivityThread.main(ActivityThread.java:6494)\xc2\xa0\n        at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)\xc2\xa0\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)\xc2\xa0\nE/AndroidRuntime: Caused by: org.koin.core.error.NoBeanDefFoundException: No definition found for class:'com.example.findgithubretrofit2rx.data.UserImpl'. Check your definitions!\n        at org.koin.core.scope.Scope.throwDefinitionNotFound(Scope.kt:246)\n        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:216)\n        at org.koin.core.scope.Scope.get(Scope.kt:181)\n        at com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Modules.kt:19)\n        at com.example.findgithubretrofit2rx.di.ModulesKt$mainModule$1$1.invoke(Unknown Source:4)\n        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)\n            ... 41 more\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,我认为有些类会导致错误。\nSearchFragment.kt、SearchViewModel.kt、UserImpl.kt、RetrofitBuilder.kt

\n
class SearchFragment : Fragment() {\n\n    private val vm: SearchViewModel by viewModel()\n    .....\n    .......\n\nclass SearchViewModel(private val userImpl: UserImpl) : ViewModel() {\n\n    private val disposable = CompositeDisposable()\n    ....\n    ......\n\nclass UserImpl(private val gitHubApi: GitHubApi) : UserRepository {\n\n    override fun getSearchUser(str: String?): Observable<SearchUserResponse> {\n        return gitHubApi.searchUsers(str)\n    }\n}\n\ninterface UserRepository {\n\n    fun getSearchUser(str: String?): Observable<SearchUserResponse>\n}\n\nclass RetrofitBuilder(val okHttpClient: OkHttpClient,\n                      val converterFactory: Converter.Factory,\n                      val adapterFactory: CallAdapter.Factory) {\n\n    inline fun <reified T> build(baseUrl: String): T {\n        return Retrofit.Builder()\n            .client(okHttpClient)\n            .baseUrl(baseUrl)\n            .addConverterFactory(converterFactory)\n            .addCallAdapterFactory(adapterFactory)\n            .build()\n            .create(T::class.java)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的模块。

\n
val appModule = module {\n\n    factory<UserRepository> { UserImpl(get()) }\n\n    viewModel { SearchViewModel(get())}\n}\n\nval networkModule = module {\n    single {\n        HttpLoggingInterceptor().apply {\n            this.level = HttpLoggingInterceptor.Level.BODY\n        }\n    }\n\n    single {\n        object : Interceptor {\n            @Throws(IOException::class)\n            override fun intercept(chain: Interceptor.Chain): Response {\n                val original: Request = chain.request()\n                val originalHttpUrl = original.url\n                val url = originalHttpUrl.newBuilder()\n                    .build()\n\n                // Request customization: add request headers\n                val requestBuilder = original.newBuilder().url(url)\n                val request = requestBuilder.build()\n                val response = chain.proceed(request)\n                return response\n            }\n        }\n    }\n\n    single {\n        OkHttpClient.Builder()\n            .addInterceptor(get<HttpLoggingInterceptor>())\n            .addInterceptor(get<Interceptor>())\n            .build()\n    }\n\n    single<CallAdapter.Factory> { RxJava2CallAdapterFactory.create() }\n\n    single<Converter.Factory> { GsonConverterFactory.create() }\n\n    single { RetrofitBuilder(get(), get(), get()) }\n\n    single<GitHubApi> { get<RetrofitBuilder>().build(GITHUB_BASE_URL) }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

rgu*_*man 6

我认为问题出在名字上。

在应用程序模块中,您正在为其创建实例UserRepository

val appModule = module {

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

    viewModel { SearchViewModel(get())}
}
Run Code Online (Sandbox Code Playgroud)

并且在 viewModel 中添加UserImpl

class SearchViewModel(private val userImpl: UserImpl)
Run Code Online (Sandbox Code Playgroud)

Koin 需要知道您添加的相同参数,即使它是一个接口。但由于许多网站建议使用抽象而不是实现来构建软件,因此请记住这一点:)。你应该UserImpl在viewModel中尝试添加UserRepository接口。

class SearchViewModel(private val userRepository: UserRepository)
Run Code Online (Sandbox Code Playgroud)