簡體   English   中英

在Android上從Dagger 2.7升級到Dagger 2.21時的Dagger 2構建錯誤

[英]Dagger 2 build error when upgrading from Dagger 2.7 to Dagger 2.21 on Android

我正在嘗試在Android應用程序中從Dagger 2.7升級到Dagger 2.21。 到目前為止,這主要涉及向子組件添加新的作用域,因為這在Dagger 2.8+中得到了實施,但在Dagger 2.7中卻沒有。 我因一個錯誤被困了幾個小時,我希望有人可以幫助我過去。 錯誤是這樣的:

error: [Dagger/MissingBinding] com.experticity.android.member.model.card.survey.SurveyCampaign cannot be provided without an @Inject constructor or an @Provides-annotated method.

我在模塊中有一個@Provides方法:

@Module
class SurveyPlayerModule(private val surveyCampaign: SurveyCampaign) {

    @Provides
    @FragmentScope
    fun provideSurveyCampaign(): SurveyCampaign {
        return surveyCampaign
    }
}

我從片段中提供了SurveyCampaign:

getComponent().surveyPlayerFragmentComponent(
                    new SurveyPlayerModule(mSurveyCampaign), new FragmentModule(this));

似乎無法獲得調查活動的類是SurveyTracker ,構造函數如下所示:

@Inject
public SurveyTracker(UserRepository userRepository, CampaignRepository campaignRepository, SurveyCampaign surveyCampaign) {// Set all of the fields from the constructor parameters}

是的,我們的項目是Kotlin和Java的結合,並逐漸向越來越多的Kotlin發展。

錯誤消息的其余部分,為簡潔起見,已刪除軟件包名稱:

SurveyCampaign is injected at SurveyTracker(…, surveyCampaign)

SurveyTracker is provided at SurveyPlayerFragmentComponent.surveyTracker() [ApplicationComponent → SessionComponent → RepositoryComponent → activity.ActivityComponent → activity.SurveyPlayerFragmentComponent]

  The following other entry points also depend on it:
      SurveyPlayerFragmentComponent.inject(SurveyPlayerViewModel) [ApplicationComponent → SessionComponent → RepositoryComponent → activity.ActivityComponent → activity.SurveyPlayerFragmentComponent]

      SurveyPlayerFragmentComponent.inject(SurveyQuestionViewModel) [ApplicationComponent → SessionComponent → RepositoryComponent → activity.ActivityComponent → activity.SurveyPlayerFragmentComponent]

      SurveyPlayerFragmentComponent.inject(SurveyCompletedViewModel) [ApplicationComponent → SessionComponent → RepositoryComponent → activity.ActivityComponent → activity.SurveyPlayerFragmentComponent]

完整的,未編輯的錯誤堆棧:

ApplicationComponent.java:11: error: [Dagger/MissingBinding] com.experticity.android.member.model.card.survey.SurveyCampaign cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface ApplicationComponent {
                ^
      com.experticity.android.member.model.card.survey.SurveyCampaign is injected at
          com.experticity.android.member.domain.SurveyTracker(…, surveyCampaign)
      com.experticity.android.member.domain.SurveyTracker is injected at
          com.experticity.android.member.ui.viewmodel.SurveyPlayerViewModel.mSurveyTracker
      com.experticity.android.member.ui.viewmodel.SurveyPlayerViewModel is injected at
          com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent.inject(com.experticity.android.member.ui.viewmodel.SurveyPlayerViewModel) [com.experticity.android.member.injection.component.ApplicationComponent → com.experticity.android.member.injection.component.SessionComponent → com.experticity.android.member.injection.component.RepositoryComponent → com.experticity.android.member.injection.component.activity.ActivityComponent → com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent]
  The following other entry points also depend on it:
      com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent.inject(com.experticity.android.member.ui.viewmodel.SurveyQuestionViewModel) [com.experticity.android.member.injection.component.ApplicationComponent → com.experticity.android.member.injection.component.SessionComponent → com.experticity.android.member.injection.component.RepositoryComponent → com.experticity.android.member.injection.component.activity.ActivityComponent → com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent]
      com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent.inject(com.experticity.android.member.ui.viewmodel.SurveyCompletedViewModel) [com.experticity.android.member.injection.component.ApplicationComponent → com.experticity.android.member.injection.component.SessionComponent → com.experticity.android.member.injection.component.RepositoryComponent → com.experticity.android.member.injection.component.activity.ActivityComponent → com.experticity.android.member.injection.component.activity.SurveyPlayerFragmentComponent]

這是組件:

@FragmentScope
@Subcomponent(modules = [SurveyPlayerModule::class, FragmentModule::class])
interface SurveyPlayerFragmentComponent {

    @ChildFragmentManager
    fun childFragmentManager(): FragmentManager

    fun surveyTracker(): SurveyTracker

    //Fragments

    fun inject(fragment: SurveyPlayerFragment)

    // ViewModels

    fun inject(viewModel: SurveyPlayerViewModel)

    fun inject(viewModel: SurveyQuestionViewModel)

    fun inject(viewModel: SurveyCompletedViewModel)

    // Adapters

    fun inject(adapter: SurveyPlayerAdapter)
}

我終於弄明白了。 我一直在想:“感覺SurveyTrackerSurveyPlayerFragment (實際上創建了模塊並將surveyCampaign傳遞給模塊)不在同一范圍內。” 我從非Dagger的角度考慮這個問題,但事實證明SurveyTracker類使用@ActivityScope范圍而不是@FragmentScope進行了注釋,就像組件和模塊中的其他所有內容一樣。 將其更改為@FragmentScope修復它。 由於某些原因,我沒有想到要在SurveyTracker上檢查注解,因為我不認為那是您可以做的。 大衛,謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM