Не удается внедрить с Dagger2 на смешанном проекте Java и Kotlin

У меня есть проект, который в основном написан на Java, но я не спешу переходить на Kotlin для новых действий. В этом проекте применяется Dagger2, и он отлично работает при использовании с действиями на основе Java. Однако, когда я создаю активность Kotlin и пытаюсь внедрить ее, я получаю следующую ошибку.

LoginIDPresenter не может быть предоставлено без @Inject конструктор или из @Provides - или же @Produces Аннотированный метод. Этот тип поддерживает внедрение членов, но не может быть предоставлен неявно.

   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)

Просто чтобы еще раз подтвердить, что когда я делаю инъекцию в свои действия на Java, это работает безупречно. Кроме того, все мои модули и файлы компонентов находятся на Java. Только когда я создаю действие Kotlin и пытаюсь сделать инъекцию там, я получаю ошибку.

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;
    }
}

1 ответ

Решение

Ваше намерение состоит в том, чтобы использовать @Inject constructor, но вы не реализуете это. Просто предоставьте основной конструктор для 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()
    }
}
Другие вопросы по тегам