我已经按照 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/