在 DialogFragment 中观察 Viewmodel Livedata

Observing Viewmodel Livedata in DialogFragment

我有一个 Viewmodel,里面有一些 Livedata 参数。其中一个 Livedata 参数的 (clickedItem) 更改旨在触发 DialogFragment.

DialogFragmentOnCreateDialog(savedInstanceState: Bundle?)方法中,我提取并使用上述Livedata参数中的数据来做某事。

这是 clickedItem 观察者方法:

clickedItem.observe(viewLifecycleOwner, Observer { clickedItem ->
                if (clickedItem != null && !dialogIsDisplayed) {
                    showAddItemDialog()
                }
            })

这是 DialogFragmentOnCreateDialog(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() 方法:

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 中的数据时,我发现它有上次更改的数据,而不是最新的数据导致 DialogFragment 触发器。 在我开始使用 clickedItem 中的最新数据之前,我不得不浏览所有曾存储在 clickedItem.

中的数据

我找到了解决此问题的方法,如下所示:

我没有在 onCreateDialog(savedInstanceState: Bundle?) 中调用 bindView(viewModel.clickedItem.value!!),而是在 onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) 方法中调用它:

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        bindView(viewModel.clickedItem.value!!)
        return binding.root
    }

这解决了问题。