3

I am injecting Presenter to BookDashboard(Activity) and BookDashboardPresenter class require an MvpView interface in it's constructor .

When i run

AppComponent

@Component(
    modules = [
        AndroidInjectionModule::class,
        ActivityBuilder::class
    ]
)
@Singleton
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {

        fun addContext(@BindsInstance context: Context): Builder
        fun addBookEngine(@BindsInstance bookEngineModule: BookEngineModule) :Builder
        fun build(): AppComponent
    }
}

ActivityBuilder.kt

@Module
abstract class ActivityBuilder {

    @ContributesAndroidInjector(modules = {BookEngineModule.class})
    public abstract BookDashboard bindBookDashboard();
}

BookEngineModule.kt

@Module
class BookEngineModule(val mvpView: BookDashboardContract.MvpView){

    @Provides
    fun providePresenter():BookDashboardContract.Presenter{
        return BookDashboardPresenter(mvpView)
    }
}

BookDashboardContract

interface BookDashboardContract {

  interface MvpView{
    fun displayBooks()
    fun showProgress()
    fun hideProgress()
  }

  interface Presenter{
    fun fetchedBooks()
  }
}

BookDashboardPresenter.kt

class BookDashboardPresenter @Inject constructor(val viewContract:BookDashboardContract.MvpView) : BookDashboardContract.Presenter{

    val bookInteractor = BookInteractor(this)

    override fun fetchedBooks() {
        bookInteractor.fetchDataFromServer()
        viewContract.displayBooks()
    }
}

BookDashboard -> Activity

class BookDashboard : DaggerAppCompatActivity(),BookDashboardContract.MvpView{

    @Inject
    lateinit var presenter: BookDashboardContract.Presenter

    override fun onCreate(savedInstanceState: Bundle?) {
        DaggerAppComponent.builder().addContext(this).
            addBookEngine(BookEngineModule(this)).build()
        super.onCreate(savedInstanceState)
        ///presenter.fetchedBooks()

    }

    override fun displayBooks() {
        Toast.makeText(this,"Books Displayed",Toast.LENGTH_LONG).show()
    }

    override fun showProgress() {}
    override fun hideProgress() {}
}

But when I build the project I am having below error

ActivityBuilder_BindBookDashboard.java:24: error: @Subcomponent.Factory method is missing parameters for required modules or subcomponents: [quiz.mania.trivia.mcq.question.di.BookEngineModule]
    interface Factory extends AndroidInjector.Factory<BookDashboard> {}

DaggerClass

@Module(subcomponents = ActivityBuilder_BindBookDashboard.BookDashboardSubcomponent.class)
public abstract class ActivityBuilder_BindBookDashboard {
  private ActivityBuilder_BindBookDashboard() {}

  @Binds
  @IntoMap
  @ClassKey(BookDashboard.class)
  abstract AndroidInjector.Factory<?> bindAndroidInjectorFactory(
      BookDashboardSubcomponent.Factory builder);

  @Subcomponent(modules = BookEngineModule.class)
  public interface BookDashboardSubcomponent extends AndroidInjector<BookDashboard> {
    @Subcomponent.Factory
    interface Factory extends AndroidInjector.Factory<BookDashboard> {}
  }
}

above class can't resolve BookEngineModule and BookDashboard

What am i missing ?

Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300
  • Dagger can't find provider for `BookDashboardContract.MvpView` to construct `BookDashboardPresenter` - you need to resolve that – ConstOrVar Feb 03 '20 at 13:52
  • see BookEngineModule – Zar E Ahmer Feb 03 '20 at 14:31
  • I saw it, it's passed through constructor of module. But where `dagger` can find it? Dagger doesn't know how to get that dependency – ConstOrVar Feb 03 '20 at 17:20
  • I have added this code in BookEngineModule @Provides fun providesMvpView(bookDashboard: BookDashboard):BookDashboardContract.MvpView{ return bookDashboard } but still not working – Zar E Ahmer Feb 04 '20 at 07:01

0 Answers0