android - Dagger 2 : ViewModel cannot be provided without an @Provides-annotated method

标签 android kotlin dagger-2 androidx android-jetpack

我遵循 GithubBrowserSample 使用的架构由谷歌。但是在 build 项目时遇到了麻烦。

我已将项目迁移到 AndroidX。我在 StackOverflow 上尝试了许多可用的答案,但均未成功。
这是我在构建时面临的构建异常:

e:/windows/Apps/Verifi/VerifiApp/app/build/tmp/kapt3/stubs/debug/com/verifi/di/component/AppComponent.java:11: error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.verifi.VerifiApp> {
                ^
      java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
          com.verifi.viewmodel.AppViewModelFactory.<init>(creators)
      com.verifi.viewmodel.AppViewModelFactory is injected at
          com.verifi.ui.auth.AuthActivity.appViewModelFactory
      com.verifi.ui.auth.AuthActivity is injected at
          dagger.android.AndroidInjector.inject(T)
  component path: com.verifi.di.component.AppComponent → com.verifi.di.module.ActivityBindingModule_AuthActivity.AuthActivitySubcomponent

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.

VerifiApp.kt
class VerifiApp: Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
        }

        AppInjector.init(this)
    }

    override fun activityInjector() = dispatchingAndroidInjector
}

应用组件.kt :
@Singleton
@Component(
    modules = [AndroidSupportInjectionModule::class,
        AppModule::class,
        ActivityBindingModule::class])
interface AppComponent: AndroidInjector<VerifiApp> {
    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    override fun inject(verifiApp: VerifiApp)
}

AppModule.kt:
@Module(includes = [ViewModelBindingModule::class])
class AppModule {

    @Provides
    @Singleton
    internal fun provideContext(application: Application): Context = application

    @Provides
    @Singleton
    internal fun getRemoteSource(remoteDataManager: RemoteDataManager): IRemoteSource = remoteDataManager

    @Provides
    @Singleton
    internal fun provideDataManger(appDataManager: AppDataManager): IAppDataSource = appDataManager

    @Singleton
    @Provides
    fun provideVerifiService(): VerifiService {
        return Retrofit.Builder()
            .baseUrl("https://api.github.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(LiveDataCallAdapterFactory())
            .build()
            .create(VerifiService::class.java)
    }
}

ViewModelBindingModule: :
@Suppress("unused")
@Module(includes = [AuthViewModelsBindingModule::class])
abstract class ViewModelBindingModule {

    @Binds
    abstract fun bindViewModelFactory(factory: AppViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(AuthViewModel::class)
    abstract fun bindAuthViewModel(authViewModel: AuthViewModel): AuthViewModel
}

任何帮助将非常感激。

最佳答案

abstract fun bindAuthViewModel(authViewModel: AuthViewModel): AuthViewModel
应该返回 ViewModel不是 AuthViewModel

关于android - Dagger 2 : ViewModel cannot be provided without an @Provides-annotated method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399582/

相关文章:

java - 如何在 Dagger 2 中使用@Scope

android - 使用网页 View 仅查看网页中的特定 div

android - 如何提供2个Retrofit接口(interface)宽度不同级别的日志记录?

android - RemoteViews 支持的方法

android - ERROR : error. NonExistentClass Kotlin 在多模块 Dagger 项目中

android - 资源$NotFoundException : String resource ID #0x0 with Toast. makeText

json - 忽略Gson反序列化中的一些嵌套项

android - Dagger 2 – 我应该使用单例 Realm 实例吗?

android - 等待在 Android 应用程序中的触发器中创建的文档

android - 在 Android 中将 UI 元素居中