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