在 dagger 2.11 之后,我们可以使用 @Binds 注解并将我们的 Module 标记为抽象类,这比具体类更加高效。
如果我的 Module 同时具有 @Provides 和 @Binds 方法,我有两个选择:
1. 最简单的方法是将您的 @Provides 实例方法标记为静态方法。 2. 如果必须将它们保留为实例方法,则可以将您的模块拆分为两个,并将所有 @Binds 方法提取到一个抽象 Module 中。
第二个选项在 Java 和 Kotlin 中都有效,但第一个选项在 Java 中有效,但我不知道如何在 Kotlin 中实现相同的功能。如果我将 @Provides 方法移动到 Companion 对象中,它会抛出“Error:(30, 1) error: @Provides methods can only be present within a @Module or @ProducerModule”错误。如何在 Kotlin 中做到这一点。
第二个选项:(有效)
ApplicationModule.kt
或者
如果我的 Module 同时具有 @Provides 和 @Binds 方法,我有两个选择:
1. 最简单的方法是将您的 @Provides 实例方法标记为静态方法。 2. 如果必须将它们保留为实例方法,则可以将您的模块拆分为两个,并将所有 @Binds 方法提取到一个抽象 Module 中。
第二个选项在 Java 和 Kotlin 中都有效,但第一个选项在 Java 中有效,但我不知道如何在 Kotlin 中实现相同的功能。如果我将 @Provides 方法移动到 Companion 对象中,它会抛出“Error:(30, 1) error: @Provides methods can only be present within a @Module or @ProducerModule”错误。如何在 Kotlin 中做到这一点。
第二个选项:(有效)
ApplicationModule.kt
@Module(includes = [ApplicationModule.Declarations::class])
abstract class ApplicationModule {
@Module
internal interface Declarations {
@Binds
fun bindContext(application: Application): Context
}
@Provides
@Singleton
fun provideMvpStarterService(): MvpStarterService {
return MvpStarterServiceFactory.makeStarterService()
}
}
第一选项:(不起作用)
ApplicationModule.kt
@Module
abstract class ApplicationModule {
//expose Application as an injectable context
@Binds
internal abstract fun bindContext(application: Application): Context
companion object {
@JvmStatic
@Provides
@Singleton
fun provideMvpStarterService(): MvpStarterService {
return MvpStarterServiceFactory.makeStarterService()
}
}
}
生成的第一选项的Java文件:
@kotlin.Metadata(mv = {1, 1, 9}, bv = {1, 0, 2}, k = 1, d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\b\'\u0018\u0000 \b2\u00020\u0001:\u0001\bB\u0005\u00a2\u0006\u0002\u0010\u0002J\u0015\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u0006H!\u00a2\u0006\u0002\b\u0007\u00a8\u0006\t"}, d2 = {"Lio/mywebsie/di/ApplicationModule;", "", "()V", "bindContext", "Landroid/content/Context;", "application", "Landroid/app/Application;", "bindContext$app_debug", "Companion", "app_debug"})
@dagger.Module()
public abstract class ApplicationModule {
public static final io.mywebsie.di.ApplicationModule.Companion Companion = null;
@org.jetbrains.annotations.NotNull()
@dagger.Binds()
public abstract android.content.Context bindContext$app_debug(@org.jetbrains.annotations.NotNull()
android.app.Application application);
public ApplicationModule() {
super();
}
@org.jetbrains.annotations.NotNull()
@javax.inject.Singleton()
@dagger.Provides()
public static final io.mywebsie.data.remote.MvpStarterService provideMvpStarterService() {
return null;
}
@kotlin.Metadata(mv = {1, 1, 9}, bv = {1, 0, 2}, k = 1, d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007\u00a8\u0006\u0005"}, d2 = {"Lio/mywebsie/di/ApplicationModule$Companion;", "", "()V", "provideMvpStarterService", "Lio/mywebsie/data/remote/MvpStarterService;", "app_debug"})
public static final class Companion {
@org.jetbrains.annotations.NotNull()
@javax.inject.Singleton()
@dagger.Provides()
public final io.mywebsie.data.remote.MvpStarterService provideMvpStarterService() {
return null;
}
private Companion() {
super();
}
}
}
更新:
感谢@David Medenjak在评论中提供的链接,让一切变得清晰明了。我找到了两种实现第一种选项的方法。
更新后的代码:
第一种选项: (已经生效)
ApplicationModule.kt
@Module(includes = [ApplicationModule.AModule::class])
abstract class ApplicationModule {
@Binds
abstract fun bindContext(application: Application): Context
@Module
object AModule {
@JvmStatic
@Provides
@Singleton
fun provideMvpStarterService(): MvpStarterService {
return MvpStarterServiceFactory.makeStarterService()
}
}
}
或者
@Module
abstract class ApplicationModule {
@Binds
abstract fun bindContext(application: Application): Context
@Module
companion object {
@Provides
@Singleton
fun provideMvpStarterService(): MvpStarterService {
return MvpStarterServiceFactory.makeStarterService()
}
}
}
两者都可以正常工作,但由于某种原因,我不喜欢第一种选项,所以我更喜欢第二种选项。
companion object
中添加@Module
,但仍会生成2个类。 - David Medenjak@Module
类中的companion object
进行了修改,请查看我的答案,https://dev59.com/mlcP5IYBdhLWcg3wFmgw#60064965 - Pavneet_Singh