定义'[Single:'com.example.handlers.SocketHandler']'尝试覆盖现有的定义koin android

问题描述

我有一个SocketHandler接口和另外两个实现该接口的类。 我想在多个处理程序中实现此接口,并通过koin注入它们。

public class Navigate {
    public static Performable toTheHomePage() {
        return Task.where("{0} opens the Etsy home page",Open.url("https://www.etsy.com/").then(DoubleClick.on(CookieDialog.ACCEPT_BUTTON))
        );
    }

    public static Performable toTheyourProfilePage() {
        return Task.where("{0} views their profile details",Click.on(MenuBar.PROFILE_PIC).then(Click.on(MenuBar.VIEW_YOUR_PROFILE))
        );
    }

    public static Performable toTheShoppingBasket() {
        return Task.where("{0} views the shopping basket",Click.on(MenuBar.BASKET)
        );
    }
}

以及这些类的Koin模块实现

interface SocketHandler {

    fun onReceive(socketResponses: Enums.socketResponses,callback: (item: String) -> Unit)

}


class ClassAHandlerImpl : SocketHandler,KoinComponent {

    override fun onReceive(
       socketResponses: Enums.socketResponses,callback: (item: String) -> Unit
    ) {
        ....
    }

}


class ClassBHandlerImpl: SocketHandler,KoinComponent {

    override fun onReceive(
        socketResponses: Enums.socketResponses,callback: (item: String) -> Unit
    ) {
        ....
   }
}

但是我得到一个例外

val handlersModule = module {
    single<SocketHandler> {
        return@single ClassAHandlerImpl()
    }

    single<SocketHandler> {
        return@single ClassBHandlerImpl()
    }

...
}

解决方法

Koin不知道要检索哪个SocketHandler实例,因为它在模块中定义了两次。

您应该使用命名参数:

val handlersModule = module {
    single<SocketHandler>(named("SocketHandlerA")) {
        return@single ClassAHandlerImpl()
    }

    single<SocketHandler>(named("SocketHandlerB")) {
        return@single ClassBHandlerImpl()
    }

...
}

然后您可以插入您的课程:

private val socketHandler by inject<SocketHandler>(named("SocketHandlerA"))