如何在Koin中每次创建新的viewModel实例

3

我在我的项目中使用Koin作为依赖注入模式,每当我加载片段/活动时,我需要创建新实例,现在我正在使用以下模式,有什么解决方案可以节省大量时间。

最初的回答:

您可以使用Koin的scope功能来管理依赖项的生命周期,并在需要时创建新实例。通过这种方式,您可以避免在每次加载片段/活动时都创建新实例。

private val homeViewModel: HomeViewModel by viewModel()

如果你有这个类,你可以在BaseActivity或BaseFragment中完成它。 - undefined
1
我两者都有,我该如何从那里开始? - undefined
感谢使用by viewModel()!我们使用自己编写的方法来创建共享的ViewModel,这就是为什么init块只会在多个片段中调用一次。 - undefined
4个回答

1
这个问题是为什么你希望每次都有新的实例?整个ViewModel的概念就是保留相同的实例和数据。viewModel {}每次注入时都会创建新的实例,除非它不是共享的。
不知道为什么对你不起作用,但我认为你可以使用factory{}代替viewModel{}
factory{
    // this is because you need new instance everytime.
    HomeViewModel()
}

1
在Koin中没有API支持以下内容:private val homeViewModel: HomeViewModel by factory { HomeViewModel() }有些人希望创建新的实例以清除LiveData缓存。 - undefined

0
在BaseFragment类中将ViewModel定义为抽象,并在扩展BaseFragment时设置其值。
abstract class BaseFragment<Binding : ViewDataBinding, ViewModel : BaseViewModel> : Fragment(){
            protected var bindingObject: Binding? = null
            protected abstract val mViewModel: ViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            bindingObject = DataBindingUtil.inflate(inflater, getLayoutResId(), container, false)
            return bindingObject?.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        performDataBinding()
    }

    @LayoutRes
    abstract fun getLayoutResId(): Int

    private fun performDataBinding() {
        bindingObject?.setLifecycleOwner(this)
        bindingObject?.setVariable(BR.viewModel, mViewModel)
        bindingObject?.executePendingBindings()
    }

}

在你的片段中
    class FragmentNew : BaseFragment<FragmentNewBinding, FragmentNewVM>() {
       // Here is the your viewmodel imlementation. Thus when you create fragment it's by default override method
       override val mViewModel: FragmentNewVM by viewModel() 

       override fun getLayoutResId(): Int = [fragment layout id like "R.layout.fragment_new"]
   }

0
确保通过by viewModel()创建ViewModel的实例。在我的情况下,我使用了另一种方式,为多个片段创建了一个共享的ViewModel。init块只被调用一次。

0
您将要放弃使用 by viewmodel 并直接实例化类。您可以通过 getKoin().get() 获取全局(作用域)变量。
private val viewModel = HomeViewModel(getKoin().get())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接