使用Koin为带两个构造方法的Builder类注入Context时遭遇定义覆盖异常的问题
使用Koin为带两个构造方法的Builder类注入Context时遭遇定义覆盖异常的问题
嘿,我来帮你搞定这个Koin的报错问题!你遇到的DefinitionOverrideException其实原因很简单:Koin默认是根据返回类型来识别不同的factory定义的,你写的两个factory最终都返回MyClass.Builder类型,Koin就会觉得这是重复定义同一个对象,所以就抛出异常啦。
给你两种靠谱的解决办法,你可以根据自己的需求选:
方法一:用命名(named)来区分不同的Factory定义
给每个factory起个独特的名字,让Koin能区分开这两个不同的Builder构造逻辑:
val module = module { // 给无参的Builder定义起个名字 factory(named("defaultBuilder")) { MyClass.Builder(androidContext()) } // 给带参数的Builder定义起另一个名字 factory(named("paramsBuilder")) { (params: SearchParameters) -> MyClass.Builder(params = params, context = androidContext()) } }
之后在获取Builder的时候,要指定对应的名字:
// 获取无参的Builder val defaultBuilder = get<MyClass.Builder>(named("defaultBuilder")) // 获取带SearchParameters参数的Builder val paramsBuilder = get<MyClass.Builder>(named("paramsBuilder")) { parametersOf(yourSearchParams) }
方法二:合并成一个Factory,用可选参数处理
更简洁的方式是把两个构造逻辑合并成一个factory,用可选参数来判断要创建哪种Builder:
val module = module { factory { (params: SearchParameters? = null) -> params?.let { MyClass.Builder(params = it, context = androidContext()) } ?: MyClass.Builder(androidContext()) } }
使用的时候就更省心了,不需要记名字:
// 获取无参的Builder,直接调用get即可 val defaultBuilder = get<MyClass.Builder>() // 获取带参数的Builder,传入参数即可 val paramsBuilder = get<MyClass.Builder> { parametersOf(yourSearchParams) }
个人更推荐第二种方法,代码更简洁,后续维护也不用额外管理命名标识~
内容来源于stack exchange
相关产品推荐
相关产品推荐

