在DialogFragment中观察Viewmodel Livedata

时间:2019-12-28 03:58:39

标签: android mvvm android-dialogfragment android-viewmodel

我有一个Viewmodel,其中包含一些Livedata参数。这些Livedata参数的(clickedItem)更改之一旨在触发DialogFragment

DialogFragment的{​​{1}}方法中,我正在提取并使用上述OnCreateDialog(savedInstanceState: Bundle?)参数中的数据来做某件事。

这是Livedata观察者方法:

clickedItem

这是clickedItem.observe(viewLifecycleOwner, Observer { clickedItem -> if (clickedItem != null && !dialogIsDisplayed) { showAddItemDialog() } }) 的{​​{1}}方法:

DialogFragment

这是OnCreateDialog(savedInstanceState: Bundle?)方法:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)

            binding = DataBindingUtil.inflate(
                requireActivity().layoutInflater,
                R.layout.business_inventory_selection_item_dialog, null, false
            )

            //Attach viewmodel to this fragment.
            setupViewModel()

            builder.setView(binding.root)

            bindView(viewModel.clickedItem.value!!)

            builder.create()

        } ?: throw IllegalStateException("Activity cannot be null")
    }

现在的问题是:当我尝试使用包装在setupViewModel()中的数据时,我发现它具有上次更改时的数据,而不是导致{ {1}}触发。 在开始利用private fun setupViewModel() { activity?.run { viewModel = ViewModelProviders.of(this) .get(BusinessInventorySelectionViewModel::class.java) with(viewModel) { itemBrand.value = null unitOfMeasurement.value = null } } bindViewModel() } private fun bindViewModel() { binding.apply { businessinventoryselectionviewmodel = viewModel lifecycleOwner = this@ItemSelectionDialogFragment } } 内部的最新数据之前,我被迫浏览了clickedItem中存储的所有数据。

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法,

我没有在DialogFragment方法中调用clickedItem,而是在clickedItem方法中调用了它:

bindView(viewModel.clickedItem.value!!)

这解决了问题。