Экземпляр SharedViewModel не восстанавливает данные из исходного экземпляра - PullRequest
0 голосов
/ 21 марта 2020

У меня есть один фрагмент, в котором я обновляю общее целое число в моем sharedViewModel, это - фрагменты shops

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 является новым экземпляром, потому что он возвращает 0, потому что мой экземпляр viewmodel инициализирует общий общий итог с 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 для работы, или есть ли способ получить тот же экземпляр, чтобы получить общее значение

Спасибо

1 Ответ

1 голос
/ 21 марта 2020

Вы можете установить ShopFragment как targetFragment для фрагмента CartBottomSheet. Таким образом, при создании общей виртуальной машины вы получите тот же экземпляр. По сути, если вы соберете это вместе, вы можете достичь этого с помощью кода ниже: -

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 
        }
    }

}

Так что теперь для открытия листа вы должны позвонить

CartBottomSheet.show(fragmentManager!!, this)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...