Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 观察DialogFragment中的Viewmodel Livedata_Android_Mvvm_Android Dialogfragment_Android Viewmodel - Fatal编程技术网

Android 观察DialogFragment中的Viewmodel Livedata

Android 观察DialogFragment中的Viewmodel Livedata,android,mvvm,android-dialogfragment,android-viewmodel,Android,Mvvm,Android Dialogfragment,Android Viewmodel,我有一个Viewmodel,里面有一些Livedata参数。其中一个Livedata参数(clickedItem)更改旨在触发对话框片段 在DialogFragment的OnCreateDialog(savedInstanceState:Bundle?方法中,我提取并使用所述Livedata参数中的数据来做某件事 以下是clickedItemobserver方法: clickedItem.observe(viewLifecycleOwner, Observer { clickedItem -&g

我有一个
Viewmodel
,里面有一些
Livedata
参数。其中一个
Livedata
参数(
clickedItem
)更改旨在触发
对话框片段

DialogFragment
OnCreateDialog(savedInstanceState:Bundle?
方法中,我提取并使用所述
Livedata
参数中的数据来做某件事

以下是
clickedItem
observer方法:

clickedItem.observe(viewLifecycleOwner, Observer { clickedItem ->
                if (clickedItem != null && !dialogIsDisplayed) {
                    showAddItemDialog()
                }
            })
以下是
对话框片段
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")
    }
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
    }
}
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        bindView(viewModel.clickedItem.value!!)
        return binding.root
    }
下面是
setupViewModel()
方法:

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")
    }
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
    }
}
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        bindView(viewModel.clickedItem.value!!)
        return binding.root
    }
现在的问题是:当我尝试使用包装在
clickedItem
中的数据时,我发现它包含上次更改的数据,而不是导致
对话框片段
触发器的最新数据。
在使用
clickedItem
中的最新数据之前,我必须检查
clickedItem
中存储的所有数据。我找到了类似以下问题的修复方法:

我没有在
onCreateDialog(savedInstanceState:Bundle?
中调用
bindView(viewModel.clickedItem.value!!)
,而是在
onCreateView(充气机:布局扁平机,容器:视图组?,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")
    }
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
    }
}
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        bindView(viewModel.clickedItem.value!!)
        return binding.root
    }

这就解决了问题。

我将此作为一个自我问答,以便对那些面对这一问题的人有所帮助。干杯