【问题标题】:UninitializedPropertyAccessException occur when i use @inject in my presenter当我在演示者中使用 @inject 时发生 UninitializedPropertyAccessException
【发布时间】:2023-06-09 05:39:01
【问题描述】:

当我在我的演示者中注入一个方法时,我得到了 UninitializedPropertyAccessException

我的提供者类

@Module
class ActivityModule(private var activity: BaseActivity) {

@Provides
fun provideActivity(): BaseActivity {
    return activity
}


@Provides
@Inject
fun providePresenter(): MainContract.Presenter {
    return MainPresenter()
}

@Provides
@Singleton
fun provideGson(): Gson {

    return GsonBuilder().setLenient().create()
}

@Provides
@Inject
@Singleton
fun provideServiceGenerator(): ServiceGenerator {

    return ServiceGenerator()
 }
}

我的组件类

@Component(modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(mainActivity: MainActivity)
}

在我的 Activity 类中,我正在注入组件,如下所示

val activityComponent = DaggerActivityComponent.builder()
        .activityModule(ActivityModule(this))
        .build()
    activityComponent.inject(this)

单击按钮即可正常工作我正在调用一个 api 正如您在我的提供中看到的那样,我有 MainContract.Presenter,正在将演示者注入到我的活动中并成功注入。

@Inject
lateinit var presenter: MainContract.Presenter

现在在我的 Presenter 中有一个 ServiceGenerator 类,我也在我的提供程序类中提供了该类,并且我在我的 Presenter 中注入服务生成器,当我将注入的 Presenter 称为 ServiceGenerator 在演示者内部给出 UninitializedPropertyAccessException 这是什么原因,我该如何解决? Presenter类的sn-p如下图

class MainPresenter : MainContract.Presenter {
@Inject
lateinit var serviceGenerator: ServiceGenerator

当我去val newsService = serviceGenerator.createService(ApiService::class.java,Constants.BASE_URL)

打电话给我,如果我做错了什么,请指导我

【问题讨论】:

    标签: android kotlin dependency-injection retrofit dagger-2


    【解决方案1】:

    您可以做以下两件事之一:

    • 坚持为您的演示者注入属性/字段,在这种情况下,您需要在您的组件中为其添加一个 inject 方法,并在您的演示者中调用它,就像您使用 @ 987654322@.

    • 使用构造函数注入,这样在Activity中注入presenter的依赖项时会“自动”注入:

      class MainPresenter @Inject constructor(
          private val serviceGenerator: ServiceGenerator
      ) : MainContract.Presenter {
      
      }
      

    【讨论】:

    • 第一种方法我不明白你能举个例子吗,也根据你的第二点我需要做提供注入乐趣提供Presenter():MainContract.Presenter { return MainPresenter(ServiceGenerator(provideGson()) ) },你是这个意思吗?