Как поделиться данными между двумя фрагментами? Возникли проблемы с архитектурой MVVM - PullRequest
0 голосов
/ 27 апреля 2020

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

Что я хотите добиться - это иметь по умолчанию местоположение пользователя и дать возможность пользователю перейти к карте выбора любого другого места. Поэтому я хотел бы:

  • Получить широту / долготу через GPS, а затем «загрузить» ее куда-нибудь, чтобы разделить эти значения между этим фрагментом и фрагментом карты (может быть, активность?)
  • Если выбрана точка на карте, обновите эти значения. Оба фрагмента могут быть прочитаны в любое время, обновиться может только фрагмент карты.

Я полагаю, что могу сделать это схематично, добавив геттеры / сеттеры к моим активность, а затем во фрагментах приведите активность к моей конкретной деятельности. Но это только кажется плохим. Каков будет правильный способ сделать это? Что у меня сейчас:

  • MainActivity (соединяет оба фрагмента через нижнюю панель навигации)
  • ForecastFragment (показывает погоду для широты / долготы)
  • ForecastViewModel
  • MapFragment
  • MapViewModel
  • WeatherRepository
  • WeatherAPI (через значения обновлений RetroFit)

Я использую кинжал и kotlin .

Спасибо!

1 Ответ

1 голос
/ 27 апреля 2020

Совместное использование модели общего вида между ForecastFragment и MapFragment с использованием области действия

Посмотрите на приведенный здесь пример Обмен данными между фрагментами

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}

Примечание:

Оба фрагмента должны обрабатывать сценарий, в котором другой фрагмент еще не создан или не виден.

...