gpt4 book ai didi

kotlin - 同一类 Kotlin 中的 @Provides 和 @Binds 方法

转载 作者:IT老高 更新时间:2023-10-28 13:40:50 25 4
gpt4 key购买 nike

在 dagger 2.11 之后,我们可以使用 @Binds 注释并将我们的模块标记为抽象,在这种情况下比具体更有效。

如果我的模块同时具有@Provides 和@Binds 方法,我有两个选择:

  1. 最简单的方法是将您的 @Provides 实例方法标记为静态。

  2. 如果需要将它们保留为实例方法,那么您可以将您的模块一分为二并提取所有 @Binds 方法到一个抽象模块中。

第二个选项在 Java 和 Kotlin 中运行良好,但第一个选项在 Java 中运行良好,但我不知道如何在 Kotlin 中实现相同的选项。如果我将 @Provides 方法移动到 Companion 对象,它会抛出 Error:(30, 1) 错误:@Provides 方法只能出现在 @Module 或 @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 link你在评论中提供的一切都清楚了我遇到了两种方法来实现第一个选项。

更新代码:

第一个选项:(工作)

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()
}
}
}

两者都工作得很好,但由于某种原因,第一个选项对我来说并不吸引人,所以我更喜欢第二个选项。

最佳答案

这是一个示例代码,用于演示如何在单个 Kotlin 类中使用 BindsProvides 注释方法:

@Module
abstract class MessagesPresentationModule {

@Module
companion object {
const val MESSAGES = 0x00

@JvmStatic
@Provides
fun provideRecyclerAdapter(
itemComparator: DisplayItemComperator,
factoryMap: Map<Int, ViewHolderFactory>,
binderMap: Map<Int, ViewHolderBinder>,
androidPreconditions: AndroidPreconditions
): RecyclerViewAdapter {
return RecyclerViewAdapter(
itemComperator = itemComparator,
viewHolderFactoryMap = factoryMap,
viewBinderFactoryMap = binderMap,
androidPreconditions = androidPreconditions
)
}
}

@Binds
@IntoMap
@IntKey(MESSAGES)
internal abstract fun provideMessagesViewModelFactory(factory: MessagesViewHolder.MessageViewHolderFactory): ViewHolderFactory

@Binds
@IntoMap
@IntKey(MESSAGES)
internal abstract fun provideMessagesViewHolderBinder(binder: MessagesViewHolder.MessagesViewHolderBinder): ViewHolderBinder
}

关于kotlin - 同一类 Kotlin 中的 @Provides 和 @Binds 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48386794/

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