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

问题描述 投票:0回答:4

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

private val homeViewModel: HomeViewModel by viewModel()
android mvvm viewmodel koin
4个回答
1
投票

问题是为什么你每次都想要新实例?

ViewModel
的整个概念是保留相同的实例和数据。
viewModel {}
每次注入时都会创建新实例,除非它不共享。

不知道为什么它不适合你,但我认为你可以使用

factory{}
而不是
viewModel{}

factory{
    // this is because you need new instance everytime.
    HomeViewModel()
}

0
投票

将 ViewModel 定义为 BaseFragment 类中的抽象,并在扩展 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
并直接实例化该类。您可以通过
getKoin().get()
获取全局(作用域)变量。

private val viewModel = HomeViewModel(getKoin().get())

0
投票

确保通过

by viewModel()
创建 ViewModel 的实例。就我而言,我使用了另一种方法,为多个片段创建一个共享视图模型。
init
区块被调用一次。

© www.soinside.com 2019 - 2024. All rights reserved.