dagger 2 Subcomponent

417 views Asked by At

while Dagger implementation i have below error. please help me resolve it.

dagger/component/AppComponent.java:10: error: [com.example.testproject.app.dagger.component.PostLoginComponent.inject(com.example.testproject.view.photo.PhotoListActivity)] com.example.testproject.data.UserStore cannot be provided without an @Inject constructor or from an @Provides-annotated method.

My understanding - I have created AppComponent and AppModule which is parent for PostLoginComponent and PostLoginModule (as they are subcomponent). photoListViewModel is injected in PhotoListActivity. photoListViewModel is provide by postLoginComponent and PostLoginModule.Now photoListViewModel need UserStore as dependency which is present in AppModule. So as per my understanding all object from parent module are available for child module. in this case UserStore from AppModule should be available for PhotoListViewModel in PostLoginModule.

But as per error UserStore is not provided.

@Module
abstract class AppModule {

    @Module
    companion object {
        @Provides
        fun provideUserStore(context: Context): UserStore {
            return UserStore(context)
        }
    }
}


@Component(modules = [AppModule::class])
interface AppComponent {

    fun postLoginComponent(): PostLoginComponent.Builder

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun bindData(context: Context): Builder

        fun build(): AppComponent
    }
}


@Module
abstract class PostLoginModule {

    @Binds
    @IntoMap
    @ViewModelKey(PhotoListViewModel::class)
    abstract fun bindViewModel(viewModel: PhotoListViewModel): ViewModel


    @MustBeDocumented
    @Target(AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    @MapKey
    annotation class ViewModelKey(val value: KClass<out ViewModel>)

}


@Subcomponent(modules = [PostLoginModule::class])
interface PostLoginComponent {

    fun inject(activity: PhotoListActivity)

    @Subcomponent.Builder
    interface Builder {

        fun build(): PostLoginComponent
    }
}


class PhotoListActivity() : PostLoginActivity() {
    var adapter = PhotoListAdapter(
        mutableListOf(
            PhotoItem("", "akash"),
            PhotoItem("", "akash"),
            PhotoItem("", "akash"),
            PhotoItem("", "akash")
        )
    )

    @Inject
    lateinit var factory: ViewModelFactory

    private val photoListViewModel: PhotoListViewModel by lazy {
        ViewModelProvider(this, factory).get(PhotoListViewModel::class.java)
    }

    override fun setLayoutId(): Int? {
        return R.layout.activity_photo_list
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
         TestApp.get(this).appComponent().postLoginComponent().build().inject(this)
         initView()
    }

    private fun initView() {
        textView.setOnClickListener {
            adapter.clearData()
        }
        rvPhotoList.initRecyclerView {
            it.layoutManager = LinearLayoutManager(this)
            it.adapter = adapter
        }
        adapter.setItemClickListener(OnRecyclerViewOnItemClickListener { parent, view, position -> })
        rvPhotoList.addErrorView(EmptyErrorView(this))
        getPhotoList()
    }

    private fun getPhotoList() {
        adapter.addItems(photoListViewModel.getPhotoList())
    }
}


class PhotoListViewModel @Inject constructor(userStore: UserStore) : BaseViewModel() {

    fun getPhotoList(): List<PhotoItem> {

        return mutableListOf(
            PhotoItem("", "aher"),
            PhotoItem("", "aher"),
            PhotoItem("", "aher"),
            PhotoItem("", "aher")
        )
    }
}
0

There are 0 answers