在 DialogFragment 中观察 Viewmodel Livedata
Observing Viewmodel Livedata in DialogFragment
我有一个 Viewmodel
,里面有一些 Livedata
参数。其中一个 Livedata
参数的 (clickedItem
) 更改旨在触发 DialogFragment
.
在DialogFragment
的OnCreateDialog(savedInstanceState: Bundle?)
方法中,我提取并使用上述Livedata
参数中的数据来做某事。
这是 clickedItem
观察者方法:
clickedItem.observe(viewLifecycleOwner, Observer { clickedItem ->
if (clickedItem != null && !dialogIsDisplayed) {
showAddItemDialog()
}
})
这是 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()
方法:
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
}
这解决了问题。
我有一个 Viewmodel
,里面有一些 Livedata
参数。其中一个 Livedata
参数的 (clickedItem
) 更改旨在触发 DialogFragment
.
在DialogFragment
的OnCreateDialog(savedInstanceState: Bundle?)
方法中,我提取并使用上述Livedata
参数中的数据来做某事。
这是 clickedItem
观察者方法:
clickedItem.observe(viewLifecycleOwner, Observer { clickedItem ->
if (clickedItem != null && !dialogIsDisplayed) {
showAddItemDialog()
}
})
这是 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()
方法:
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
}
这解决了问题。