我正在读一些代码,很难理解。
import dagger.Component
import dagger.Module
import dagger.Provides
import javax.inject.Inject
class Sound(val noise: String)
class Dog @Inject constructor(val sound: Sound)
@Module
class DogModule() {
@Provides
fun provideWoWo(): Sound = Sound("wowo")
@Provides
fun provideDog(sound : Sound): Dog = Dog(sound)
}
@Component(modules = [ DogModule::class ])
interface AnimalComponent {
val dog: Dog
}
fun main() {
val component = DaggerAnimalComponent.create()
println("The dog has sound ${component.dog.sound.noise}.")
}为什么class Sound(val noise: String)没有@Inject
我以为是class Sound @Inject constructor(val noise: String)
因为Sound类实例也是通过匕首创建的,就像Dog类实例一样
发布于 2022-04-25 13:15:09
因为您使用构造函数参数显式地设置了@Provides。@Inject用来省略@Provides。在您的代码中,@Inject on Dog也可以被删除。
总之,如果要用@Inject创建这个类,就不必添加@Provides
发布于 2022-04-26 20:41:34
,因为声音类实例也是通过匕首创建的,就像Dog类实例一样
这是不正确的:Dog和Sound都不是通过Dagger创建的。Dagger允许注入Dog和Sound,但是在模块中您要在您定义的@Provides方法/函数中创建实例。
这也意味着当前忽略了Dog和Sound的Sound注释,因为Dagger不是这些对象构造的一部分。相反,您自己提供了这些:@Provides方法和函数可以接收图形中的对象,Dagger将提供这些对象,这就是作为@Provides Dog方法的一部分来接收@Provides Dog的方式。因此,如果Dog的构造函数参数列表发生变化,则需要自己更改@Provides方法。Dagger也不会自动填充在文档中标记为“方法注入”和“字段注入”的@Inject-annotated方法和字段。
如果要删除用于@Provides的Dog方法,则Dagger将读取参数列表本身,并在其更改时自动做出反应。方法和字段注入也将自动工作。
因此,除非您想重写或自定义传递给构造函数的参数,否则永远不需要在带有@Provides构造函数的类上使用@Inject。我建议在可能的情况下使用@Inject,并且只为您无法控制的代码或其他特殊情况保留@Provides。见我的另一个,所以在这里回答:Android Dagger 2: Inject versus Provides
https://stackoverflow.com/questions/72000059
复制相似问题