gpt4 book ai didi

android - 如何通过 Koin 提供具有接口(interface)的 ViewModel

转载 作者:行者123 更新时间:2023-12-04 13:38:36 25 4
gpt4 key购买 nike

我有以下 ViewModel 设置:

interface FooViewModel {}

class FooViewModelImpl: ViewModel(), FooViewModel {}

我想像这样通过 Koin 提供它:
viewModel<FooViewModel> { FooViewModelImpl() }

它不起作用,因为 Koin 在定义中期望 ViewModel 而不是 FooViewModel,并且我不想让我的 FooViewModel 成为从 ViewModel 扩展的抽象类。

有没有办法通过 Koin 做到这一点?

最佳答案

我让它工作的唯一方法是覆盖 Koin 扩展函数并强制限定符:

  • 覆盖 Koin 模块扩展功能以删除 ViewModel从其泛型定义:
  • inline fun <reified T> Module.customViewModel(
    qualifier: Qualifier? = null,
    noinline definition: Definition<T>
    ): BeanDefinition<T> {
    return viewModel(qualifier ?: named(T::class.java.name), definition = definition)
    }

    inline fun <reified T> Module.viewModel(
    qualifier: Qualifier? = null,
    override: Boolean = false,
    noinline definition: Definition<T>
    ): BeanDefinition<T> {
    val beanDefinition = factory(qualifier, override, definition)
    beanDefinition.setIsViewModel()
    return beanDefinition
    }
  • 以同样的方式覆盖 Koin LifecycleOwner 扩展函数:
  • inline fun <reified T> LifecycleOwner.customViewModel(
    qualifier: Qualifier? = null,
    noinline parameters: ParametersDefinition? = null
    ): Lazy<T> = lazy { getViewModel<ViewModel>(qualifier ?: named(T::class.java.name), parameters) as T }

    inline fun <reified T> LifecycleOwner.getCoreViewModel(
    qualifier: Qualifier? = null,
    noinline parameters: ParametersDefinition? = null
    ): T = getViewModel<ViewModel>(qualifier ?: named(T::class.java.name), parameters) as T

    然后你可以提供 FooViewModel 作为
    viewModel<FooViewModel> { FooViewModelImpl() }

    并将其注入(inject)为:
    private val viewModel: FooViewModel by customViewModel()
    // or
    val viewModel: FooViewModel = getCustomViewModel()

    虽然这是可能的,但我认为这不是一个好主意,只是想分享我的发现。最好的方法是使用抽象类(继承自 Android ViewModel)而不是接口(interface)。

    关于android - 如何通过 Koin 提供具有接口(interface)的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60306347/

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