我试图在非Activity类中进行字段注入(inject),但是我总是得到该字段尚未初始化/为空。我已经阅读了Can I use Dagger 2's field injection in Kotlin?,也阅读了Dagger 2 on Android @Singleton annotated class not being injected,但仍然有同样的问题。这是我设置的方式
这是模特类
class Greetings {
val sayHello: String = "Hello from Dagger 2"
}
这是模块类@Module
class GreetingsModule {
@Provides
@Singleton
fun providesGreetings(): Greetings {
return Greetings()
}
}
这是组件@Singleton
@Component(modules = arrayOf(GreetingsModule::class))
interface GreetingsComponent {
fun inject(mainActivity: MainActivity)
fun inject(testGreetings: TestGreetings)
}
以及从Application扩展的类class App: Application() {
private lateinit var greetingsComponent: GreetingsComponent
override fun onCreate() {
super.onCreate()
greetingsComponent = DaggerGreetingsComponent.builder().build()
}
fun getGreetings() = greetingsComponent
}
这就是我将其注入(inject)另一个类的方式,其中null /未初始化class TestGreetings {
@Inject
lateinit var greetings: Greetings
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
我到底在做什么错? 最佳答案
好吧,我会尽力回答
您不能使用在Greetings
类中为TestGreetings
的Field Injection,因为Dagger不知道如何注入(inject)它。
通常将字段注入(inject)用于与Android Framework相关的组件,因此在您的情况下为MainActivity
TestGreetings
类不是Android Framework类,因此最好使用构造函数注入(inject),如下所示
class TestGreetings(private val greetings: Greetings) {
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
为了让Dagger知道如何初始化TestGreetings
类,您需要在GreetingsModule
类中对其进行定义@Module
class GreetingsModule {
...
@Provides
@Singleton
fun providesTestGreetings(greetings: Greetings): TestGreetings {
return TestGreetings(greetings)
}
}
现在您可以在TestGreetings
中使用MainActivity
类class MainActivity: AppCompatActivity() {
@Inject
lateinit var testGreetings: TestGreetings
override fun onCreate(savedInstanceState: Bundle?) {
...
testGreetings.checkIfNull()
}
}
最后,您可以在fun inject(testGreetings: TestGreetings)
中删除GreetingsComponent
P.s.确保MainActivity
中的Dagger设置正确希望这可以把事情弄清楚:)