SharedViewModel 实例不从原始实例恢复数据
SharedViewModel instance does not recover data from original instance
我有一个片段,我在其中更新了我的 sharedViewModel 中的总整数,这是 shopsFragment
class ShopFragment : Fragment(), AppBarLayout.OnOffsetChangedListener {
private val model: SharedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.updateTotal(200)
}
}
现在,我需要共享这些数据的另一个片段是 BottomSheetDialogFragment
,在这个片段中,我通过这样做
获得了 sharedViewModel
的一个实例
class CartBottomSheet: BottomSheetDialogFragment() {
private val model: SharedViewModel by viewModels ({requireParentFragment()})
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.getTotal().observe(viewLifecycleOwner, Observer { total ->
sheet_total_price.text = "$$total.00"
})
}
现在,当我尝试获取我在另一个片段中发布的 200 时,它显示 0,这意味着该 sharedViewModel 的实例是一个新实例,因为它 returns 0 因为我的视图模型实例用 0
初始化一个公共共享总数
class SharedViewModel: ViewModel() {
private val totalData = MutableLiveData<Int>()
private var sharedTotal = 0
fun updateTotal(total:Int){
sharedTotal = total
totalData.value = sharedTotal
}
fun getTotal():LiveData<Int>{
return totalData
}
现在,我的问题是,我是否需要将 BottomDialogFragment
这个 sharedViewmodel
的实例作为一个包传递给它来使用,或者是否有任何方法可以获得相同的实例获取 total
的值
谢谢
对于 CartBottomSheet
片段,您可以将 ShopFragment
设置为 targetFragment
。这样,当您创建共享 VM 时,您将获得相同的实例。基本上,如果你把它放在一起,你可以通过下面的代码实现它:-
class CartBottomSheet: BottomSheetDialogFragment() {
private val model: SharedViewModel?=null
companion object {
fun show(fragmentManager: FragmentManager, parentFragment: Fragment) {
val sheet = CartBottomSheet()
sheet.setTargetFragment(parentFragment, 13)
sheet.show(fragmentManager, sheet.tag)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
targetFragment?.let {
// Create model here with it
}
}
}
所以现在开始 sheet 你应该打电话给
CartBottomSheet.show(fragmentManager!!, this)
我有一个片段,我在其中更新了我的 sharedViewModel 中的总整数,这是 shopsFragment
class ShopFragment : Fragment(), AppBarLayout.OnOffsetChangedListener {
private val model: SharedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.updateTotal(200)
}
}
现在,我需要共享这些数据的另一个片段是 BottomSheetDialogFragment
,在这个片段中,我通过这样做
sharedViewModel
的一个实例
class CartBottomSheet: BottomSheetDialogFragment() {
private val model: SharedViewModel by viewModels ({requireParentFragment()})
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
model.getTotal().observe(viewLifecycleOwner, Observer { total ->
sheet_total_price.text = "$$total.00"
})
}
现在,当我尝试获取我在另一个片段中发布的 200 时,它显示 0,这意味着该 sharedViewModel 的实例是一个新实例,因为它 returns 0 因为我的视图模型实例用 0
初始化一个公共共享总数class SharedViewModel: ViewModel() {
private val totalData = MutableLiveData<Int>()
private var sharedTotal = 0
fun updateTotal(total:Int){
sharedTotal = total
totalData.value = sharedTotal
}
fun getTotal():LiveData<Int>{
return totalData
}
现在,我的问题是,我是否需要将 BottomDialogFragment
这个 sharedViewmodel
的实例作为一个包传递给它来使用,或者是否有任何方法可以获得相同的实例获取 total
谢谢
对于 CartBottomSheet
片段,您可以将 ShopFragment
设置为 targetFragment
。这样,当您创建共享 VM 时,您将获得相同的实例。基本上,如果你把它放在一起,你可以通过下面的代码实现它:-
class CartBottomSheet: BottomSheetDialogFragment() {
private val model: SharedViewModel?=null
companion object {
fun show(fragmentManager: FragmentManager, parentFragment: Fragment) {
val sheet = CartBottomSheet()
sheet.setTargetFragment(parentFragment, 13)
sheet.show(fragmentManager, sheet.tag)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
targetFragment?.let {
// Create model here with it
}
}
}
所以现在开始 sheet 你应该打电话给
CartBottomSheet.show(fragmentManager!!, this)