代码之家  ›  专栏  ›  技术社区  ›  Ali

使用Dagger2将适配器注入碎片

  •  1
  • Ali  · 技术社区  · 6 年前

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

    @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 正在将回调实现为单击侦听器:

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

    以及:

    class MainFragment : DaggerFragment(), ArtistClickCallback
    

    @Module
    class MainFragmentModule {
    
        @Provides
        fun provideArtistAdapter(mainFragment: MainFragment) = ArtistAdapter(mainFragment)
    
    }
    

    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]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ismael Di Vita    6 年前

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

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

    @Module
    class MyAwesomeFragmentModule {
    
        @Provides
        fun provideArtistAdapter() = ArtistAdapter()
    
    }