作者:sunsnowswift | 来源:互联网 | 2023-01-30 16:00
对于最近版本的匕首2,所做的改进之一是具有静态提供方法的可能性.简单地说:
@Provides
static A providesA() {
return A();
}
我想知道如何在kotlin做这件事?我试过了
@Module
class AModule {
companion object {
@JvmStatic
@Provides
fun providesA(): A = A()
}
}
但我收到错误消息:
@Provides methods can only be present within a @Module or @ProducerModule
我猜这里有同伴对象,但是我对Kotlin很新,我不确定如何做到这一点.它甚至可能吗?
谢谢!
1> Omar Al Hala..:
虽然我认为zsmb13的解决方案更好,但我找到了另一种解决方案
@Module
class AModule {
@Module
companion object {
@JvmStatic
@Provides
fun providesA(): A = A()
}
// add other non-static provides here
}
但是请注意,将有两个生成的类:AModule_ProvidesAFactory
和AModule_Companion_ProvidesAFactory
而不是一个AModule_ProvidesAFactory
用于与对象,而不是一类与同伴对象的情况下类
如果模块类中同时存在静态提供程序方法和"@Binds"注释方法,则接受的答案将不起作用,而此答案适用于这两种情况.
实际上,@ zsmb13的解决方案对我不起作用,您的对我来说无效。
这也很好,因为AModule可以是抽象的
2> zsmb13..:
我现在无法测试它,但我认为这应该有效:
@Module
object AModule {
@JvmStatic
@Provides
fun providesA(): A = A()
}
但是有了"对象",它会不会让这个单例类太久了?刚刚使用内存转储测试,甚至在杀死活动并将其从堆中完全删除后,我仍然在内存中存在"对象AModule",这不是我们想要的......
我不认为这个解决方案效果很好,因为使你的AModule"对象"不是"类"会在应用程序周围创建很多单例模块,即使你不再需要这个模块实例它们也会存在,例如你有屏幕范围.一旦你访问你的屏幕,将创建模块单例,它将永远不会被清理,因为它是"对象"
3> sophia..:
似乎是谷歌批准的一个很好的解释是https://github.com/google/dagger/issues/900
具体来说,请看:
静态提供可以通过@JvmStatic实现.我看到有两种情况出现:
顶级object
的
@Module object DataModule {
@JvmStatic @Provides fun
provideDiskCache() = DiskCache()
}
如果你有一个现有的类模块,事情会有点怪异
@Module abstract class DataModule {
@Binds abstract fun provideCache(diskCache: DiskCache): Cache
@Module
companion object {
@JvmStatic @Provides fun provideDiskCache() = DiskCache()
}
}
这种方式的工作方式如下:
伴随对象也必须在引擎盖下注释为@Module,kotlin编译器会将这些静态提供方法复制到DataModule类中.匕首会看到那些并将它们视为常规静态场.Dagger也会在伴侣对象中看到它们,但是"模块"将从匕首获得代码,但被标记为"未使用".IDE将这样标记,因为provideDiskCache方法将被标记为未使用.您可以告诉IntelliJ忽略这个注释,注释使用@Provides通过quickfix注释