kotlin 中的字段注入始终为空
Field injection in kotlin is always null
我正在尝试在非 Activity class 中进行字段注入,但我总是发现该字段尚未 initialized/null。我已经阅读了, also ,但仍然有同样的问题。这是我的设置方式
这是模型class
class Greetings {
val sayHello: String = "Hello from Dagger 2"
}
这是模块class
@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
class App: Application() {
private lateinit var greetingsComponent: GreetingsComponent
override fun onCreate() {
super.onCreate()
greetingsComponent = DaggerGreetingsComponent.builder().build()
}
fun getGreetings() = greetingsComponent
}
这就是我将它注入另一个 class 的方式,null/not 在哪里初始化
class TestGreetings {
@Inject
lateinit var greetings: Greetings
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
我到底做错了什么??
好的,我会尽力回答
您不能在 TestGreetings
class 中使用 Greetings
字段注入,因为 Dagger 不知道如何注入它。
Field Injection 通常用于与 Android Framework 相关的组件,因此在您的情况下是 MainActivity
TestGreetings
class 不是 Android Framework class,所以最好使用 Constructor Injection,像这样
class TestGreetings(private val greetings: Greetings) {
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
为了让Dagger知道如何初始化TestGreetings
class,需要在GreetingsModule
class
中定义
@Module
class GreetingsModule {
...
@Provides
@Singleton
fun providesTestGreetings(greetings: Greetings): TestGreetings {
return TestGreetings(greetings)
}
}
现在您可以在 MainActivity
中使用 TestGreetings
class
class MainActivity: AppCompatActivity() {
@Inject
lateinit var testGreetings: TestGreetings
override fun onCreate(savedInstanceState: Bundle?) {
...
testGreetings.checkIfNull()
}
}
最后,您可以删除 GreetingsComponent
中的 fun inject(testGreetings: TestGreetings)
P.s。确保 MainActivity
中的 Dagger 设置正确
希望这一切都清楚了:)
我正在尝试在非 Activity class 中进行字段注入,但我总是发现该字段尚未 initialized/null。我已经阅读了
这是模型class
class Greetings {
val sayHello: String = "Hello from Dagger 2"
}
这是模块class
@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
扩展的 classclass App: Application() {
private lateinit var greetingsComponent: GreetingsComponent
override fun onCreate() {
super.onCreate()
greetingsComponent = DaggerGreetingsComponent.builder().build()
}
fun getGreetings() = greetingsComponent
}
这就是我将它注入另一个 class 的方式,null/not 在哪里初始化
class TestGreetings {
@Inject
lateinit var greetings: Greetings
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
我到底做错了什么??
好的,我会尽力回答
您不能在 TestGreetings
class 中使用 Greetings
字段注入,因为 Dagger 不知道如何注入它。
Field Injection 通常用于与 Android Framework 相关的组件,因此在您的情况下是 MainActivity
TestGreetings
class 不是 Android Framework class,所以最好使用 Constructor Injection,像这样
class TestGreetings(private val greetings: Greetings) {
fun checkIfNull() {
if (greetings != null) {
Log.d("INFO", "${ greetings.sayHello}")
} else {
Log.d("INFO", "null !!!!!!")
}
}
}
为了让Dagger知道如何初始化TestGreetings
class,需要在GreetingsModule
class
@Module
class GreetingsModule {
...
@Provides
@Singleton
fun providesTestGreetings(greetings: Greetings): TestGreetings {
return TestGreetings(greetings)
}
}
现在您可以在 MainActivity
TestGreetings
class
class MainActivity: AppCompatActivity() {
@Inject
lateinit var testGreetings: TestGreetings
override fun onCreate(savedInstanceState: Bundle?) {
...
testGreetings.checkIfNull()
}
}
最后,您可以删除 GreetingsComponent
fun inject(testGreetings: TestGreetings)
P.s。确保 MainActivity
中的 Dagger 设置正确
希望这一切都清楚了:)