我试图在非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相关的组件,因此在您的情况下为MainActivityTestGreetings类不是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)中删除GreetingsComponentP.s.确保MainActivity中的Dagger设置正确
希望这可以把事情弄清楚:)

09-28 09:28