Будет ли общая ViewModel при использовании данных одного фрагмента в другом фрагменте при переходах

Ответ

Да, общая ViewModel будет использоваться, если оба фрагмента находятся в пределах одного Activity. ViewModel хранится в Activity scope, поэтому фрагменты могут получить доступ к одной ViewModel через ViewModelProvider(requireActivity()).

Пример:

// В обоих фрагментах  
val sharedViewModel: SharedViewModel by activityViewModels()  

// SharedViewModel.kt  
class SharedViewModel : ViewModel() {  
    val sharedData = MutableLiveData<String>()  
}  

Нюансы:

  • Если фрагменты в разных Activity, ViewModel будет разной.
  • Не злоупотребляйте общей ViewModel, чтобы не создавать сильную связь между фрагментами.
  • Для навигации между фрагментами лучше использовать Navigation Component с Safe Args.

Ответ 18+ 🔞

Ага, вот тут как раз тот самый случай, когда можно не городить огород! Если твои фрагменты сидят в одной Activity, то общую ViewModel они спокойно могут юзать через scope этой самой активити. Это как общий холодильник на коммунальной кухне — все лезут, все берут, только не забудь подписать свою колбасу.

Код примерно так выглядит, ёпта:

// В обоих фрагментах  
val sharedViewModel: SharedViewModel by activityViewModels()  

// SharedViewModel.kt  
class SharedViewModel : ViewModel() {  
    val sharedData = MutableLiveData<String>()  
}  

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

Во-вторых, не начинай совать в эту общую ViewModel всё подряд, а то получится пиздопроебищная свалка. Фрагменты станут завязаны друг на друге сильнее, чем алкоголик на дешёвом портвейне. Если нужно просто передать данные при навигации — есть же Navigation Component с его Safe Args! Это специально придумано, чтобы не делать костыли из ViewModel. Используй по назначению, ядрёна вошь.

И главное — если начинаешь чувствовать, что твоя общая ViewModel превращается в монстра с овердохуищем полей и методов, это верный знак, что архитектура пошла по пизде. Пора остановиться, выдохнуть и пересмотреть, какую хуйню ты творишь.