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
}
这就解决了问题。我将此作为一个自我问答,以便对那些面对这一问题的人有所帮助。干杯