【问题标题】:Cannot inject with Dagger2 on Java and Kotlin mixed project无法在 Java 和 Kotlin 混合项目上使用 Dagger2 注入
【发布时间】: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


【解决方案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()
    }
}

【讨论】:

  • 我是Java背景,没看太多入门书就直接跳进了Kotlin XD我想我会读的
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2017-09-29
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多