android - 使用 Dagger2 将适配器注入(inject) fragment

标签 android kotlin android-recyclerview dagger-2

我已经按照 Android 架构蓝图 Dagger2 进行依赖注入(inject):https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger

现在我想将 Adapter 注入(inject)到我的 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 中显示数据。当我不使用注入(inject)而只是使用 val adapter = ArtistAdapter() 时,它会起作用。

我在使用 Dagger2 进行注入(inject)时缺少什么?

附录:

mainFragment 将回调实现为点击监听器:

interface ArtistClickCallback {
    fun onClick(artist: LastFmArtist, poster : ImageView)
}

和:

class MainFragment : DaggerFragment(), ArtistClickCallback

这是 fragment 模块:

@Module
class MainFragmentModule {

    @Provides
    fun provideArtistAdapter(mainFragment: MainFragment) = ArtistAdapter(mainFragment)

}

但是当我从 Fragment 构造函数中删除 @Inject 时出现以下异常:

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]

最佳答案

从 Fragment 构造函数中删除 @Inject 并为 fragment 提供适配器或在适配器中使用注入(inject)构造函数

@Module
abstract class MainModule {
    @FragmentScoped
    @ContributesAndroidInjector(modules = [MyAwesomeFragmentModule::class])
    internal abstract fun mainFragment(): MainFragment

} 

-

@Module
class MyAwesomeFragmentModule {

    @Provides
    fun provideArtistAdapter() = ArtistAdapter()

}

关于android - 使用 Dagger2 将适配器注入(inject) fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54402542/

相关文章:

Android 软键盘隐藏了屏幕底部的输入字段。需要手动滚动到底部

java - 如何访问没有名称的对象内的 JSON 对象

kotlin - IntelliJ/Kotlin PSI 中的注释与注释条目

android - 如何重用 RecyclerView 对象、适配器和 View 持有者

java - 通过 Intent 将数据从 App 传递到 Widget 时的空指针

android - 如何自定义DatePickerDialog?

android - Kotlin 数据绑定(bind) - 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

python - 包含 dateparser 后无法通过 Chaquopy 在 Android Studio 中启动 python 脚本

android - 将 Stripe 的 creatToken 转换为 Kotlin

java - RecyclerView适配器类中Android View Binding的正确方式是什么?