【发布时间】:2018-06-14 05:28:06
【问题描述】:
我有一个主要用 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;
}
}
【问题讨论】:
-
我真的需要这样做吗?对于我需要上下文的其他 java Presenter 类,我没有这样做
-
kapt 处理器是否需要混合项目?像这样在 app build.gradle 文件中
kapt "com.google.dagger:dagger-compiler:$rootProject.dagger" -
我将我所有的
annotationProcessor替换为kapt我所有的匕首提供类都生成了。
标签: android dependency-injection kotlin dagger-2 dagger