我有我的 miewModel,我正在将其注入(inject)我的 fragment throw ViewModelProviders.of(activity, viewModelFactory).get(MyViewModel::class.java)
。
它在第一次创建 fragment 时工作正常,但如果我关闭我的 fragment ,那么我会收到一个错误“layout must not be null
”,它指向我的一些布局我在我的 fragment 中使用。
据我所知,之所以发生这种情况,是因为数据绑定(bind)仍然有一些指向我的 fragment 的链接。那么如何解绑呢?
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) {
}
}
View 模型模块:
@Binds
@IntoMap
@ViewModelKey(MyViewModel::class)
internal abstract fun bindMyViewModel(myViewModel: MyViewModel): ViewModel
最佳答案
要将 ViewModel
生命周期绑定(bind)到您需要调用的 fragment :
val vm = ViewModelProviders.of(fragnemt, viewModelFactory)[MyViewModel::class.java]
代替:
val vm = ViewModelProviders.of(activity, viewModelFactory)[MyViewModel::class.java]
不要忘记在 ViewModel.onCleared()
中释放资源
关于android - 销毁时如何从 Activity 中解除绑定(bind)viewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54517174/