我在我的项目中使用Koin作为依赖注入模式,每当我加载片段/活动时,我需要创建新实例,现在我正在使用以下模式,有什么解决方案可以节省大量时间。
最初的回答:
您可以使用Koin的scope功能来管理依赖项的生命周期,并在需要时创建新实例。通过这种方式,您可以避免在每次加载片段/活动时都创建新实例。
private val homeViewModel: HomeViewModel by viewModel()
ViewModel
的概念就是保留相同的实例和数据。viewModel {}
每次注入时都会创建新的实例,除非它不是共享的。factory{}
代替viewModel{}
。factory{
// this is because you need new instance everytime.
HomeViewModel()
}
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"]
}
by viewModel()
创建ViewModel的实例。在我的情况下,我使用了另一种方式,为多个片段创建了一个共享的ViewModel。init
块只被调用一次。by viewmodel
并直接实例化类。您可以通过 getKoin().get()
获取全局(作用域)变量。private val viewModel = HomeViewModel(getKoin().get())
by viewModel()
!我们使用自己编写的方法来创建共享的ViewModel,这就是为什么init
块只会在多个片段中调用一次。 - undefined