Android 无法在Java和Kotlin混合项目上使用Dagger2进行注入
我有一个项目,主要是用Java编写的,但我正在放缓迁移到Kotlin进行新活动的步伐。这个项目应用了Dagger2,当与基于Java的活动一起使用时,它可以完美地工作。但是,当我创建Kotlin活动并尝试注入时,我得到以下错误 如果没有Android 无法在Java和Kotlin混合项目上使用Dagger2进行注入,android,dependency-injection,kotlin,dagger-2,dagger,Android,Dependency Injection,Kotlin,Dagger 2,Dagger,我有一个项目,主要是用Java编写的,但我正在放缓迁移到Kotlin进行新活动的步伐。这个项目应用了Dagger2,当与基于Java的活动一起使用时,它可以完美地工作。但是,当我创建Kotlin活动并尝试注入时,我得到以下错误 如果没有@Inject构造函数或@Provides-或@products-注释方法,则无法提供LoginIDPresenter。此类型支持成员注入,但不能隐式提供 void inject(LoginIDActivity loginIDActivity);
@Inject
构造函数或@Provides
-或@products
-注释方法,则无法提供LoginIDPresenter
。此类型支持成员注入,但不能隐式提供
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()
}
}
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);
.
.
.
}
@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;
}
}
ActivityModule.java
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
.
.
.
void inject(LoginIDActivity loginIDActivity);
.
.
.
}
@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;
}
}
您的意图是使用
@injectconstructor
,但您没有实现它。只需为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()
}
}
类LoginIDPresenter@Inject构造函数(
@ActivityContext val上下文:上下文
):BasePresenter(){
覆盖趣味附件视图(loginIDMvpView:loginIDMvpView){
super.attachView(loginIDMvpView)
}
覆盖视图(){
super.detachView()
mcompositionsubscription.clear()
}
}
我真的需要这样做吗?对于其他java presenter类,我没有这样做,因为在这些类中,我需要上下文,而kapt processor需要混合项目吗?在app build.gradle文件kapt“com.google.dagger:dagger编译器:$rootProject.dagger“
中,我将我的所有annotationProcessor
替换为kapt
生成了我所有提供dagger的类。我来自Java背景,直接跳入Kotlin,没有阅读它的入门XD,我想我会读它