Dagger 2未注入,lateinit属性未初始化

时间:2019-12-29 09:47:40

标签: android kotlin dependency-injection dagger-2

我正在尝试使用Dagger 2注入Context。我在此网站上看到了许多与此相关的其他问题,但仍然无法解决问题。

AppComponent.kt:

class ComplianceLaw(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=100)
    slug = models.SlugField(max_length=40)


class Compliance(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=1000)
    compliance_law = models.ForeignKey(
        verbose_name=_("Compliance Law"), to=ComplianceLaw, on_delete=models.CASCADE
    )

class ComplianceGroup(TimeStampModel):
    name = models.CharField(verbose_name=_("Name"), max_length=1000)
    compliance_law = models.ForeignKey(
        verbose_name=_("Category Law"), to=ComplianceLaw, on_delete=models.CASCADE
    )
    compliance = models.ManyToManyField(verbose_name=_("Compliance"), to=Compliance)

    def clean_fields(self, exclude=None):
        super().clean_fields(exclude=exclude)
        compliances = self.compliance.all().values_list("compliance_law_id", "id")
        errors = []
        for compliance, oid in compliances:
            if compliance != self.compliance_law_id:
                errors.append("{} is not a valid group element.".format(oid))
        if errors:
            raise ValidationError({self.compliance.name: errors})
# serializers.py
class ComplianceGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = ComplianceGroup
        fields = (
            "id",
            "name",
            "compliance_law",
            "compliance",
            "created_on",
            "modified_on",
        )
        read_only_fields = ("created_on", "modified_on")


# views.py
class ComplianceGroupListCreateView(generics.ListCreateAPIView):
    permission_classes = (IsAdmin,)
    queryset = ComplianceGroup.objects.all().order_by("id")
    serializer_class = ComplianceGroupSerializer

AppModule.kt:

@Singleton
@Component(
    modules = [
        AppModule::class
    ]
)
interface AppComponent {
    fun context(): Context
    fun inject(context: Context)
}

MainApp.kt:

@Module
class AppModule(private val context: Context) {

    @Provides
    @Singleton
    fun providesApplicationContext(): Context = context
}

Manager.kt :(我要在其中注入上下文的类)

class MainApp : Application() {
    lateinit var appComponent: AppComponent

    override fun onCreate() {
        super.onCreate()
        appComponent = initDagger()
        appComponent.inject(this)
    }

    private fun initDagger() = DaggerAppComponent.builder()
        .appModule(AppModule(this))
        .build()
}

但是,从class Manager { @Inject lateinit var context: Context fun foo() { context.resources } } 的{​​{1}}函数中说context.resources时,从任何地方调用Manager().foo()时,都会出现以下错误:

onCreate()

如何解决此问题?为什么Dagger不注入MainActivity

1 个答案:

答案 0 :(得分:0)

尝试使用constructor注入

class Manager @Inject constructor(val context: Context) {

    fun foo() {
       context.resources
    }
}

然后在您的Activity/Fragment中使用manager,如下所示:

@Inject lateinit var manager: Manager