как использовать одни и те же mutableLiveData во ViewModel из фрагмента и фрагмента диалога - PullRequest
2 голосов
/ 16 июня 2020

У меня есть ViewModel, который я использовал в Fragment и DialogFragment. В Dialog Fragment я пытаюсь обновить значение MutableLiveData в Dialog Fragment, а затем использовать это значение из MutableLiveData в моем фрагменте. когда я проверяю фрагмент диалогового окна, у меня есть данные внутри MutableLiveData, но при попытке доступа к этим данным внутри фрагмента я получил значение null. пожалуйста, посоветуйте мне, как решить эту проблему?

в ViewModel:

val width = MutableLiveData<String>()
val height = MutableLiveData<String>()
val length = MutableLiveData<String>()

в DialogFragment:

vModel.width.value = "6"
vModel.height.value = "6"
vModel.length.value = "6"

и в моем фрагменте, когда я пытаюсь доступ к данным из MutableLiveData:

println(vModel.width.value)
println(vModel.height.value)
println(vModel.length.value)

это мой BaseFragment:

abstract class BaseFragment<B : ViewDataBinding, V : BaseViewModel>(
    private val layout: Int,
    private val viewModel: V
) : Fragment() {

    private lateinit var v: View
    protected lateinit var binding: B
    protected lateinit var vModel: V


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        binding = DataBindingUtil.inflate(inflater, layout, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        this.vModel = viewModel


        initVariables()
        initObserves()
        initViews()

        return binding.root
    }

    abstract fun initVariables()
    abstract fun initObserves()
    abstract fun initViews()

}

это мой BaseDialogFragment:

abstract class BaseDialogFragment<B : ViewDataBinding, V : BaseViewModel>(
    private val layout: Int,
    private val viewModel: V
) : DialogFragment() {

    private lateinit var v: View
    protected lateinit var binding: B
    protected lateinit var vModel: V


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        super.onCreateView(inflater, container, savedInstanceState)
        binding = DataBindingUtil.inflate(inflater, layout, container, false)
        binding.lifecycleOwner = viewLifecycleOwner
        this.vModel = viewModel


        initVariables()
        initObserves()
        initViews()

        return binding.root
    }

    abstract fun initVariables()
    abstract fun initObserves()
    abstract fun initViews()

}

1 Ответ

1 голос
/ 16 июня 2020

Убедитесь, что вы загрузили свою ViewModel с контекстом действия, чтобы один экземпляр был доступен для всех фрагментов и не создавался заново для каждого.

что-то вроде этого

val viewModel by activityViewModels<MainViewModel> ()
...