简体   繁体   中英

Cannot inject with Dagger2 on Java and Kotlin mixed project

I have a project which is primarily written in Java but I'm slowing moving to Kotlin for the new activities. This project applies Dagger2 and work perfectly when used with Java based activities. However, when I create Kotlin activity and try to inject, I get the following error.

LoginIDPresenter cannot be provided without an @Inject constructor or from an @Provides - or @Produces -annotated method. This type supports members injection but cannot be implicitly provided.

   void inject(LoginIDActivity loginIDActivity);

     com.maxis.mymaxis.ui.logindigitalid.LoginIDPresenter is injected at
         com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity.loginIDPresenter
     com.maxis.mymaxis.ui.logindigitalid.LoginIDActivity is injected at
         com.maxis.mymaxis.injection.component.ActivityComponent.inject(loginIDActivity)

Just to reaffirm again, when I do injection in my Java activities, it works flawlessly. Also, my Module and Component files are all in Java. Only when I create a Kotlin activity and try injecting there, I get the error.

LoginIDPresenter.kt

class LoginIDPresenter : BasePresenter<LoginIDMvpView>() {

    lateinit var mContext : Context

    @Inject
    fun LoginIDPresenter(@ActivityContext context: Context){
        mContext = context
    }

    override fun attachView(loginIDMvpView: LoginIDMvpView) {
        super.attachView(loginIDMvpView)
    }

    override fun detachView() {
        super.detachView()
        mCompositeSubscription.clear()
    }
}

LoginIDActivity.kt

class LoginIDActivity : BaseActivity(), LoginIDMvpView {

    @Inject lateinit var loginIDPresenter : LoginIDPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        loginIDPresenter.attachView(this)
    }

    override fun showErrorMessageDialog(errorObject: ErrorObject?) {
        if (errorObject != null) {
            Util.alertDialogBackToLandingPage(this, errorObject.getErrorUiMessage(), R.drawable.error_name)
        }
    }

    override fun getLayoutResourceId(): Int {
        return R.layout.activity_login_id
    }

    override fun injectActivity(component: ActivityComponent?) {
        component?.inject(this)
    }

    override fun setToolBar() {
        //no toolbar
    }
}

ActivityComponent .java

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
.
.
.
void inject(LoginIDActivity loginIDActivity);
.
.
.
}

ActivityModule.java

@Module
public class ActivityModule {

    private Context mContext;

    public ActivityModule(Context context) {
        mContext = context;
    }

    @Provides
    @ForActivity
    Activity provideActivity() {
        return (Activity) mContext;
    }

    @Provides
    @ActivityContext
    Context providesContext() {
        return mContext;
    }
}

Your intention is to use @Inject constructor , but you're not implementing it. Just provide a primary constructor for LoginIDPresenter :

class LoginIDPresenter @Inject constructor(
        @ActivityContext val context: Context
) : BasePresenter<LoginIDMvpView>() {

    override fun attachView(loginIDMvpView: LoginIDMvpView) {
        super.attachView(loginIDMvpView)
    }

    override fun detachView() {
        super.detachView()
        mCompositeSubscription.clear()
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM