我正在尝试使用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
?
答案 0 :(得分:0)
尝试使用constructor
注入
class Manager @Inject constructor(val context: Context) {
fun foo() {
context.resources
}
}
然后在您的Activity/Fragment
中使用manager
,如下所示:
@Inject lateinit var manager: Manager