moxy-community / Moxy

Moxy is MVP library for Android with incremental annotation processor and ktx features
MIT License
327 stars 33 forks source link

Inject with dagger2 #74

Closed vcimka closed 4 years ago

vcimka commented 4 years ago

Trying to use Moxy + Dagger2. @ProvidePresenter fun doesn't trigger and as result presenter cant be initialized. What's i doing wrong?

FragmentModule:

@Module
class ShowcaseFragmentModule {
    @Provides
    fun provideShowcaseFragmentPresenter(): ShowcaseFragmentPresenter = ShowcaseFragmentPresenter()
}

Fragment:

class ShowcaseFragment : MvpAppCompatFragment(), Injectable, ShowcaseFragmentView {
    @Inject
    lateinit var daggerPresenter: Lazy<ShowcaseFragmentPresenter>

    @InjectPresenter
    lateinit var presenter: ShowcaseFragmentPresenter

    @ProvidePresenter
    fun providePresenter(): ShowcaseFragmentPresenter = daggerPresenter.get()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View =
        inflater.inflate(R.layout.fragment_showcases, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        presenter.test()
    }

    override fun text(str: String) {
        text.text = str
    }
}

View:

interface ShowcaseFragmentView : MvpView {
    fun text(str: String)
}

Presenter:

@InjectViewState
class ShowcaseFragmentPresenter : MvpPresenter<ShowcaseFragmentView>() {

    override fun onFirstViewAttach() {
        super.onFirstViewAttach()
    }

    fun test() {
        viewState.text("abcde")
    }
}

Deps:

ext.moxy_ver = '2.0.2'
    ext.dagger_ver = '2.25.2'
//moxy
    implementation "com.github.moxy-community:moxy-androidx:$moxy_ver"
    implementation "com.github.moxy-community:moxy-material:$moxy_ver"
    kapt "com.github.moxy-community:moxy-compiler:$moxy_ver"
//dagger 
implementation "com.google.dagger:dagger:$dagger_ver"
    implementation "com.google.dagger:dagger-android-support:$dagger_ver"
    kapt "com.google.dagger:dagger-compiler:$dagger_ver"
    kapt "com.google.dagger:dagger-android-processor:$dagger_ver"
VovaStelmashchuk commented 4 years ago

Try to add a constructor with inject annotation to Presenter. And you can remove dagger module.

aasitnikov commented 4 years ago

Code you gave seems valid, check if generated ShowcaseFragment$$PresenterBinder calls providePresenter() method.

You could also simplify your fragment with moxy-ktx:

@Inject
lateinit var daggerPresenter: Lazy<ShowcaseFragmentPresenter>

private val presenter by moxyPresenter { daggerPresenter.get() }