как использовать одни и те же mutableLiveData во ViewModel из фрагмента и фрагмента диалога

У меня есть ViewModel, который я использовал во фрагментах и ​​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()

}

person Mehrdad Dolatkhah    schedule 16.06.2020    source источник
comment
Вы должны опубликовать всю историю. Похоже, ваша модель представления не совсем модель общего представления.   -  person ror    schedule 16.06.2020


Ответы (1)


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

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

val viewModel by activityViewModels<MainViewModel> ()
person Sergey    schedule 16.06.2020
comment
Я использую эти BaseFragment и BaseDialogFragment. это неправильно? - person Mehrdad Dolatkhah; 16.06.2020
comment
вы можете проверить это developer.android.com/topic/libraries/architecture/viewmodel взгляните на раздел "Обмен данными между фрагментами", - person Sergey; 16.06.2020