2017-12-31 170 views
0

Ich habe eine App-Komponente und eine abhängige Komponente. Die App-Komponente deklariert explizite Abhängigkeiten und die abhängige Komponente kann diese injizieren. Wenn ich jedoch eine Abhängigkeit habe, die ich mit einem @Qualifier disambiguieren muss, ist die abhängige Komponente nicht in der Lage, diese Abhängigkeit zu injizieren.Dolch2 und Qualifier in abhängigen Komponenten

Dies ist die App Komponente

@Component(modules = [AppModule::class, SchedulersModule::class, StorageModule::class]) 

@ApplicationScope 
interface AppComponent { 
    fun inject(app: Application) 
    /* other stuff omitted for brevity */ 
    val bitmapCache: BitmapCache   
    @UiScheduler fun uiScheduler(): Scheduler 
} 

Dieses das Planungsmodul ist:

@Qualifier 
@Retention(AnnotationRetention.RUNTIME) 
annotation class UiScheduler 

Und das ist die abhängige Komponente:

@Module 
class SchedulersModule { 
    @ApplicationScope 
    @Provides 
    @IoScheduler 
    fun provideIoScheduler(): Scheduler = Schedulers.io() 

    @ApplicationScope 
    @Provides 
    @UiScheduler 
    fun provideMainThreadScheduler(): Scheduler = AndroidSchedulers.mainThread() 
} 

Dies ist der Qualifier ist

@Component(
     dependencies = [AppComponent::class], 
     modules = [EditEntryActivityModule::class, ViewModelModule::class] 
) 

@ActivityScope 
interface EditEntryActivityComponent { 
    fun inject(editEntryActivity: EditEntryActivity) 
    fun inject(editEntryFragment: EditEntryFragment) 
} 

Dies ist, wie der Scheduler in dem Fragment injiziert wird:

class EditEntryFragment : Fragment() { 
    @Inject @UiScheduler lateinit var uiScheduler: Scheduler 
    /* other stuff */ 
} 

Warum kann die abhängige Komponente, die die Bitmap-Cache injizieren, in der übergeordneten Komponente deklariert, aber nicht der UI-Scheduler? Das ist der Fehler, den ich bekommen:

error: io.reactivex.Scheduler cannot be provided without an @Provides- or @Produces-annotated method. 
    io.reactivex.Scheduler is injected at 
     com.test.edit.EditEntryFragment.uiScheduler 
    com.test.edit.EditEntryFragment is injected at 
     com.test.edit.EditEntryActivityComponent.inject(arg0) 
1 error 

Antwort

1

Mit @field: UiScheduler in Klasse EditEntryFragment

0

Versuchen @Named annotition

@Inject @field:Named("UiScheduler") lateinit var uiScheduler: Scheduler 

Check-out this issue

+0

Dies ist syntaktisch falsch (Sie vermissen die Anführungszeichen auf UiScheduler), aber egal, dies ist für eine '@ Named' Annotation, ich verwende derzeit Qualifier. Die selbe Lösung trifft nicht zu oder zumindest nicht so, wie ich es beurteilen kann. Gibt es eine Variante dieses '@ field' Fixes für Abhängigkeiten mit' @Qualifier'? – Francesc

+0

Ich weiß es nicht. Vielleicht kannst du "@Named" ausprobieren. – Garywzh

+0

Danke, aber die Frage ist spezifisch für Qualifikanten. – Francesc