我正在尝试使用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)每个需要使用它的类中,而不是静态地调用其方法。