销毁活动时如何解除ViewModel的绑定

时间:2019-02-04 13:28:36

标签: android data-binding android-databinding

我有我的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) {
}
}

ViewModelModule:

@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
internal abstract fun bindMyViewModel(myViewModel: MyViewModel): ViewModel

1 个答案:

答案 0 :(得分:1)

要将ViewModel的生命周期绑定成碎片,您需要调用:

val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]

代替:

val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]

别忘了释放ViewModel.onCleared()中的资源