我遵循的例子声称这是更好的“新方式”。 (https://proandroiddev.com/exploring-the-new-dagger-android-module-9eb6075f1a46)完整的示例源代码在这里(https://github.com/jshvarts/DaggerAndroidKotlinSampleApp)。它使用它来向这样的Activity注入属性,
class MainActivity:AppCompatActivity()
{
@Inject
lateinit var something:Something
override fun onCreate(..)
{
AndroidInjection.inject(this)
...
一个模块
@Module
abstract class ActivitiesModule
{
@ContributesAndroidInjector
abstract fun bindMainActivity():MainActivity
效果很好,但是自定义Dialog
类呢?我使用一些自定义参数创建Dialog(仅在运行时使用用户的输入),如下所示。我可以修改MyDialog的构造函数来取something
,然后让活动最终将something
传递给MyDialog的构造函数。
但它会很难看,因为活动并没有直接创建MyDialog。 MainActivity具有自定义控件,当单击按钮时,该自定义控件会显示MyDialog。因此,要使用构造函数方法,我必须将something
从MainActivity传递到自定义控件,然后让自定义控件使用something
创建MyDialog。
class MyDialog:Dialog
{
@Inject
lateinit var something:Something
constructor(context:Context?, arg1, args2, args3):super(context)
{
//Cannot call AndroidInjection.inject, because
//it does not take a Dialog.
AndroidInjection.inject(this); //<--Does NOT work.
如果我能告诉Dagger在其构造函数中注入MyDialog的字段......对此有什么解决方法?
答案 0 :(得分:0)
AndroidInjection仅适用于活动和片段等类,而不适用于对话框。如果要注入对话框,请改用对话框片段。或者,因为您实际上只能调用构造函数,所以使用构造函数注入而不是Dagger。