如何在Android项目中通过Dagger 2提供活动上下文?

问题描述 投票:-1回答:1

这是我在活动中的代码。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_work_order)
        DaggerWorkOrderComponent.factory()
                .create(activity)
                .inject(activity)
}

这是我的模块。

@Module
object WorkOrderModule {

    private lateinit var context: Context

    fun setWorkOrderActivityContext(ctx: Context) {
        context = ctx
    }

    @Provides
    @JvmStatic
    fun provideContext(): Context = context

    @Provides
    @JvmStatic
    fun provideLogger(): Logger = getLogger()

    @Provides
    @JvmStatic
    fun provideAppDataManager(): AppDataManager = getAppDataManager()

    @Provides
    @JvmStatic
    fun provideFirebaseManager(): FirebaseManager = getFirebaseManager()

    @Provides
    @JvmStatic
    fun provideViewModel(
        logger: Logger,
        appDataManager: AppDataManager,
        firebaseManager: FirebaseManager
    ): WorkOrderVM = WorkOrderVM(context, logger, appDataManager, firebaseManager) // <=== line 45
}

最后,这是我的组件。@FeatureScope

@Component(modules = [WorkOrderModule::class])
interface WorkOrderComponent {

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance context: Context): WorkOrderComponent
    }

    fun inject(activity: WorkOrderActivity)
}

应用程序崩溃,这是我得到的:

原因:kotlin.UninitializedPropertyAccessException:lateinit属性上下文尚未初始化在com.atco.forsite.screens.inspection.workOrder.di.WorkOrderModule.provideViewModel(WorkOrderModule.kt:45)

第45行已在模块中标记。

android kotlin dagger-2
1个回答
0
投票

我会做如下。

提供Context作为Dagger模块的构造函数参数:

@Module
class WorkOrderModule constructor(private val context: Context)

这里不再需要lateinit var contextfun setWorkOrderActivityContext(ctx: Context)

然后在ActivityonCreate()中将模块设置为组件:

DaggerWorkOrderComponent
    .builder()
    .module(
        WorkOrderModule(this)
    )
    .build()
    .inject(this)

在这种情况下,也不需要interface Factory

© www.soinside.com 2019 - 2024. All rights reserved.