Не удается внедрить с 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()
}
}