我正在尝试使用Dagger 2注入(inject)Context

AppComponent.kt:

@Singleton
@Component(
    modules = [
        AppModule::class
    ]
)
interface AppComponent {
    fun context(): Context
}

AppModule.kt:
@Module
class AppModule(private val application: Application) {

    @Provides
    @Singleton
    fun providesApplicationContext(): Context = application
}

MainApp.kt:
class MainApp : Application() {
    lateinit var appComponent: AppComponent

    override fun onCreate() {
        super.onCreate()
        appComponent = initDagger()
    }

    private fun initDagger() = DaggerAppComponent.builder()
        .appModule(AppModule(this))
        .build()
}

Manager.kt :(要在其中注入(inject)Context的类)
object Manager {

    @Inject
    lateinit var context: Context
}

但是,我得到以下错误:
error: Dagger does not support injection into static fields
    public static android.content.Context context;
                                          ^

这是因为我使用的是object(Singleton)吗?
如果您对问题有任何疑问,请在下面评论。谢谢。

最佳答案



是的,object的属性是Java的底层静态字段。您的Manager类将反编译为类似于以下内容的东西:

public final class Manager {
    @Inject
    @NotNull
    public static Context context;

    public static final Manager INSTANCE;

    static {
        INSTANCE = new Manager();
    }

    private Manager() {
    }

    @NotNull
    public final Context getContext() {
        return context;
    }

    public final setContext(Context var1) {
        context = var1;
    }
}

和Dagger 2只是does not support injection into static fields。但是,即使Dagger允许您这样做,依存关系也不会得到满足。这是因为,除非明确告知Dagger,否则Dagger无法将其注入(inject)到对象中(就像您将其注入(inject)到 Activity 中一样)或自行创建对象。显然,后者不适用于Kotlin的object。为了要求Dagger注入(inject)依赖关系,您必须以某种方式提供MainApp实例:
init {
    mainApp.appComponent.inject(this)
}

这没有多大意义,因为您首先想将其作为Context注入(inject)。

因此,您必须手动满足依赖性并且不要在此麻烦Dagger或将object想法抛在后面,仅使用标准类并让Dagger处理其范围:
@Singleton
class Manager @Inject constructor(private val context: Context) {

}

唯一的缺点是您必须将Manager实例(由Dagger创建)注入(inject)每个需要使用它的类中,而不是静态地调用其方法。

07-24 09:46
查看更多