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)