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

时间:2019-12-20 20:31:40

标签: android kotlin dagger-2

这是我在“活动”中的代码。

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行已在模块中标记。

1 个答案:

答案 0 :(得分:0)

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

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

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

然后在Activity的{​​{1}}中将模块设置为component:

onCreate()

在这种情况下,也不需要DaggerWorkOrderComponent .builder() .module( WorkOrderModule(this) ) .build() .inject(this)