gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:57:27 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com