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知道如何初始化TestGreetingsclass,需要在GreetingsModuleclass

中定义
@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 设置正确

希望这一切都清楚了:)