android - 销毁时如何从 Activity 中解除绑定(bind)viewModel

标签 android data-binding android-databinding

我有我的 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/

相关文章:

android:数据绑定(bind)错误:找不到符号类

java - 从编辑文本创建一个 Observable

java - 碰撞事件

android - 在 Android 4.4 中启用 TLS 1.2

Android WebRTC 与英特尔 webRTC 套件崩溃

c# - 索引超出范围错误;这里而不是那里?

android - 如何取消定时器并更新同一个定时器?

javascript - 没有数据绑定(bind)的渲染值

c# - 应该如何在 WinForms GUI 控件和客户端类之间同步数据?

android - 如何从可完成中引发错误