匕首注入ViewModel工厂编译时错误(匕首中的依赖循环)

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

我在编译时从匕首收到以下错误消息。它在匕首中找到一个dependency cycle

public abstract interface AppComponent extends dagger.android.AndroidInjector<com.sample.android.storytel.StorytelApplication> {
            ^
  androidx.lifecycle.ViewModelProvider.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.providePost$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.di.DetailModule.bindViewModelFactory$app_debug(factory)
  androidx.lifecycle.ViewModelProvider.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 providePost(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
2个回答
0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.