如何在 activity 销毁时取消绑定 viewModel
How to unbind viewModel from activity when it's destroying
我有我的 miewModel,我正在将其注入我的片段 ViewModelProviders.of(activity, viewModelFactory).get(MyViewModel::class.java)
。
它在第一次创建片段时工作正常,但如果我关闭我的片段,那么我会得到一个错误“layout must not be null
”,它指向我正在使用的一些布局我的片段。
据我所知,之所以发生这种情况是因为数据绑定仍然有一些指向我的片段的链接。那么如何解绑呢?
class MyFragment: Fragment(), Injectable {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
activity?.window?.changeStatusBarColor(this.requireContext(), R.color.yellow_status_bar)
val binding: MyLayoutBinding = DataBindingUtil.inflate(inflater, R.layout.my_layout, container, false)
binding.viewModel = viewModel
viewModel.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
}
}
视图模型模块:
@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
internal abstract fun bindMyViewModel(myViewModel: MyViewModel): ViewModel
要将 ViewModel
生命周期绑定到片段,您需要调用:
val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]
而不是:
val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]
别忘了在ViewModel.onCleared()
释放资源
我有我的 miewModel,我正在将其注入我的片段 ViewModelProviders.of(activity, viewModelFactory).get(MyViewModel::class.java)
。
它在第一次创建片段时工作正常,但如果我关闭我的片段,那么我会得到一个错误“layout must not be null
”,它指向我正在使用的一些布局我的片段。
据我所知,之所以发生这种情况是因为数据绑定仍然有一些指向我的片段的链接。那么如何解绑呢?
class MyFragment: Fragment(), Injectable {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
activity?.window?.changeStatusBarColor(this.requireContext(), R.color.yellow_status_bar)
val binding: MyLayoutBinding = DataBindingUtil.inflate(inflater, R.layout.my_layout, container, false)
binding.viewModel = viewModel
viewModel.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
}
}
视图模型模块:
@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
internal abstract fun bindMyViewModel(myViewModel: MyViewModel): ViewModel
要将 ViewModel
生命周期绑定到片段,您需要调用:
val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]
而不是:
val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]
别忘了在ViewModel.onCleared()