如何在 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()

释放资源