【问题标题】:How to unbind viewModel from activity when it's destroying销毁时如何将viewModel与活动解除绑定
【发布时间】:2019-06-28 06:06:35
【问题描述】:

我有我的 miewModel,我将其注入到我的片段 throw 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

【问题讨论】:

    标签: android data-binding android-databinding


    【解决方案1】:

    ViewModel生命周期绑定到你需要调用的片段:

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

    代替:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多