Dagger注入ViewModel工厂编译时错误

问题描述 投票:1回答:1

我在编译时从匕首收到以下错误消息:

  public abstract interface AppComponent extends dagger.android.AndroidInjector<com.sample.android.storytel.StorytelApplication> {
                    ^
          com.sample.android.storytel.domain.Post is injected at
              com.sample.android.storytel.viewmodels.DetailViewModel.Factory(…, post)
          com.sample.android.storytel.viewmodels.DetailViewModel.Factory is injected at
              com.sample.android.storytel.ui.DetailFragment.factory
          com.sample.android.storytel.ui.DetailFragment is injected at
              com.sample.android.storytel.di.DetailModule.provideArguments$app_debug(fragment)
          com.sample.android.storytel.domain.Post is injected at
              com.sample.android.storytel.viewmodels.DetailViewModel.Factory(…, post)
          com.sample.android.storytel.viewmodels.DetailViewModel.Factory is injected at
              com.sample.android.storytel.ui.DetailFragment.factory
          com.sample.android.storytel.ui.DetailFragment is injected at
              dagger.android.AndroidInjector.inject(T) [com.sample.android.storytel.di.AppComponent com.sample.android.storytel.di.ActivityBindingModule_MainActivity$app_debug.MainActivitySubcomponent → com.sample.android.storytel.di.DetailModule_DetailFragment$app_debug.DetailFragmentSubcomponent]

这是我的DetailModule:

@Module
abstract class DetailModule {

    @ContributesAndroidInjector
    internal abstract fun detailFragment(): DetailFragment

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

    @Module
    companion object {

        @Provides
        @JvmStatic
        internal fun provideArguments(fragment: DetailFragment): Post =
            DetailFragmentArgs.fromBundle(fragment.arguments!!).post
    }
}

这里是AppComponent:

@Singleton
@Component(
    modules = [ActivityBindingModule::class,
        AndroidSupportInjectionModule::class,
        Network::class,
        BaseModule::class]
)
interface AppComponent : AndroidInjector<StorytelApplication> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }
}

这里是ActivityBindingModule:

@Module
abstract class ActivityBindingModule {

    @ContributesAndroidInjector(
        modules = [MainModule::class,
            DetailModule::class]
    )
    internal abstract fun mainActivity(): MainActivity
}

这是我的DetailViewModel工厂:

/**
     * Factory for constructing DetailViewModel with parameter
     */
    class Factory @Inject constructor(
        private val useCase: DetailUseCase,
        val post: Post
    ) : ViewModelProvider.Factory {
        override fun <T : ViewModel?> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(DetailViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return DetailViewModel(useCase, post) as T
            }
            throw IllegalArgumentException("Unable to construct viewmodel")
        }
    }

我已经在我的DetailFragment中注入了工厂:

class DetailFragment @Inject
constructor() // Required empty public constructor
    : DaggerFragment() {

    @Inject
    lateinit var factory: DetailViewModel.Factory

    private val viewModel: DetailViewModel by lazy {
        ViewModelProviders.of(this, factory)
            .get(DetailViewModel::class.java)
    }
}

在这里您可以找到源代码:https://github.com/Ali-Rezaei/Colors

android viewmodel dagger-2
1个回答
0
投票

您的@Binds知道如何绑定ViewModelProvider.Factory而不是DetailViewModel.Factory。基本上,您可以认为这就像您在告诉dagger一样,每次您要求该接口的实现时,都应使用具体的DetailViewModel.Factory。基本上@Binds知道如何解析ViewModelProvider.Factory。所以你应该注射

© www.soinside.com 2019 - 2024. All rights reserved.