我有我的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
答案 0 :(得分:1)
要将ViewModel
的生命周期绑定成碎片,您需要调用:
val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]
代替:
val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]
别忘了释放ViewModel.onCleared()
中的资源