как каждый раз создавать новый экземпляр viewModel в koin - PullRequest
0 голосов
/ 17 июня 2019

Am Используя Koin как Шаблон внедрения зависимостей в моем проекте, мне нужно создавать новые экземпляры всякий раз, когда я загружаю фрагмент / действие, теперь я использую следующий шаблон, любое решение для этогоэто может сэкономить много времени.

private val homeViewModel: HomeViewModel by viewModel()

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Вопрос в том, почему вы хотите новые экземпляры каждый раз?Вся концепция ViewModel состоит в том, чтобы сохранить тот же экземпляр и данные.viewModel {} создает новый экземпляр каждый раз, когда вы вводите его, если он не используется совместно.

Не знаю, почему он не работает для вас, но я думаю, что вы можете использовать factory{} вместо viewModel{}.

factory{
    // this is because you need new instance everytime.
    HomeViewModel()
}
0 голосов
/ 17 июня 2019

Определите 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"]
   }
...