android - Dagger 2 在 Kotlin 对象中注入(inject)上下文

标签 android kotlin dependency-injection dagger-2

我正在尝试使用 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
}

主应用程序.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;
                                          ^

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

最佳答案

Is this because I am using an 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 只是不支持注入(inject)静态字段。然而,即使 Dagger 让你这样做,依赖性也不会得到满足。那是因为 Dagger 将无法注入(inject)到一个对象中,除非被明确告知这样做(就像你在注入(inject)到 Activity 中时所做的那样)或自己创建对象。显然后者不适用于 Kotlin 的 object。为了让 Dagger 注入(inject)依赖项,您必须以某种方式提供 MainApp 实例:

init {
    mainApp.appComponent.inject(this)
}

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

因此,您必须要么手动满足依赖关系并且不要在这个中使用 Dagger,要么将 object 想法抛在脑后,仅使用标准类并让 Dagger 处理其范围:

@Singleton
class Manager @Inject constructor(private val context: Context) {

}

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

关于android - Dagger 2 在 Kotlin 对象中注入(inject)上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59509103/

相关文章:

c# - 使用 dotnet core 2.1 的 AWS Lambda 函数中的依赖注入(inject)

java - 在 Dagger 2 的 Activity 中传递应用程序上下文 (NullPointerException)

android - 如何在我的项目中集成 opencv

android - Android 版 Venmo 中的沙盒模式

kotlin - 在 Kotlin 中访问私有(private)方法

Kotlin 允许与具有不同返回类型的属性 getter 相同的函数签名

dependency-injection - 使用 IOC 框架绑定(bind)到多个具体实现?

Android后台网络错误恢复

android - 找不到方法 XXX,引用自方法 YYY

android - 类型不匹配。必需 : Color Found: Any. 如何解决此问题?