在我的项目中以 Koin 作为依赖项注入模式,我需要在每次加载片段/活动时创建新实例,现在正在使用以下模式,任何解决方案这样可以节省很多时间。
private val homeViewModel: HomeViewModel by viewModel()
答案 0 :(得分: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"]
}
答案 1 :(得分:0)
问题是为什么每次都需要新实例? ViewModel
的整个概念是保留相同的实例和数据。每次插入viewModel {}
都会创建一个新实例,除非不共享它。
不知道为什么它不适合您,但我认为您可以使用factory{}
代替viewModel{}
。
factory{
// this is because you need new instance everytime.
HomeViewModel()
}
答案 2 :(得分:0)
您将要放弃使用by viewmodel
并直接实例化该类。您可以通过getKoin().get()
获取全局(作用域)变量。
private val viewModel = HomeViewModel(getKoin().get())