Я следовал за архитектурой Android Dagger2 для внедрения зависимостей: https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger
Теперь я хочу внедрить Adapter в мой класс Fragment:
@ActivityScoped
class MainFragment @Inject
constructor(): DaggerFragment() {
@Inject lateinit var adapter : ArtistAdapter
}
И у меня есть следующее в модулекласс:
@Module
abstract class MainModule {
@FragmentScoped
@ContributesAndroidInjector
internal abstract fun mainFragment(): MainFragment
@Module
companion object {
@Provides
@ActivityScoped
@JvmStatic internal fun provideArtistAdapter() = ArtistAdapter()
}
}
Но по какой-то причине он не отображает данные в RecyclerView.Когда я не использую инъекцию и просто использую val adapter = ArtistAdapter()
, это работает.
Чего мне не хватает в инъекции с использованием Dagger2?
Дополнения:
mainFragment
isреализация обратного вызова в качестве прослушивателя щелчков:
interface ArtistClickCallback {
fun onClick(artist: LastFmArtist, poster : ImageView)
}
И:
class MainFragment : DaggerFragment(), ArtistClickCallback
А вот фрагмент модуля:
@Module
class MainFragmentModule {
@Provides
fun provideArtistAdapter(mainFragment: MainFragment) = ArtistAdapter(mainFragment)
}
Но я получаю следующее исключение, когда яудалить @Inject из конструктора Fragment:
error: [Dagger/MissingBinding] com.sample.android.lastfm.ui.main.MainFragment cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.sample.android.lastfm.LastFmApp> {
^
A binding with matching key exists in component: com.sample.android.lastfm.ui.main.MainModule_MainFragment$app_debug.MainFragmentSubcomponent
com.sample.android.lastfm.ui.main.MainFragment is injected at
com.sample.android.lastfm.ui.main.MainActivity.mainFragment
com.sample.android.lastfm.ui.main.MainActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.sample.android.lastfm.di.AppComponent → com.sample.android.lastfm.di.ActivityBindingModule_MainActivity$app_debug.MainActivitySubcomponent]