使用Dagger2将适配器注入片段

时间:2019-01-28 12:57:43

标签: android kotlin recycler-adapter dagger-2

我已遵循Android体系结构蓝图Dagger2进行依赖项注入:https://github.com/googlesamples/android-architecture/tree/todo-mvp-dagger

现在我想将Adapter注入我的Fragment类:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="ovladani">

                <input type="checkbox" value="-y1" class="regulaceTeploty">
                <h2>Tempeture regulation</h2>
                  <input type="checkbox" value="-a" class="radOvladac">Heater<br>
                  <input type="checkbox" value="-b" class="radOvladac">Ground heater 1<br>
                  <input type="checkbox" value="-c" class="radOvladac">Ground heater 2<br>
                  <input type="checkbox" value="-d" class="radOvladac">Funcoil<br>

              </div>

我在模块类中有以下内容:

@ActivityScoped
class MainFragment @Inject
constructor(): DaggerFragment() {

    @Inject lateinit var adapter : ArtistAdapter 
}

但是由于某种原因,它无法在RecyclerView中显示数据。当我不使用注入而仅使用@Module abstract class MainModule { @FragmentScoped @ContributesAndroidInjector internal abstract fun mainFragment(): MainFragment @Module companion object { @Provides @ActivityScoped @JvmStatic internal fun provideArtistAdapter() = ArtistAdapter() } } 时,它就可以工作。

使用Dagger2注射时我缺少什么?

附录:

val adapter = ArtistAdapter()正在将回调实现为点击侦听器:

mainFragment

然后:

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

这是片段模块:

class MainFragment : DaggerFragment(), ArtistClickCallback

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

@Module
class MainFragmentModule {

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

}

1 个答案:

答案 0 :(得分:1)

从Fragment构造函数中删除@Inject,并将适配器提供给片段,或在适配器中使用inject构造函数

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

} 

-

@Module
class MyAwesomeFragmentModule {

    @Provides
    fun provideArtistAdapter() = ArtistAdapter()

}