Kotlin — совместное использование viewmodel между данными на основе выбора

#android #kotlin #navigation

#Android #kotlin #навигация

Вопрос:

Я хочу поделиться viewmodel между фрагментами, допустим, у меня есть фрагмент, который отображает представление recycler с элементом (viewholders), и когда я нажимаю на один из них, я хочу, чтобы элемент отображался во frangmentB для подробного просмотра. До сих пор я определил два способа сделать это. 1) Наличие super viewmodel, которая распределяется между фрагментами, и удерживает ссылку на выбранную viewmodel следующим образом :

 class ShareHappyPlaceModel : ViewModel() {
    val happyPlace: MutableLiveData<HappyPlaceModel> = MutableLiveData()
}
 

2) Преобразуйте модель представления в класс данных, который реализует parcable, и делитесь им с помощью навигации между фрагментами. Затем во FragmentB воссоздайте viewmodel из объекта класса данных.

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

Каково ваше мнение?

Комментарии:

1. Вы уверены, что вам нужна общая ViewModel? Разве вы не можете просто передать выбранный элемент в качестве аргумента для нового фрагмента? Если вам действительно нужно разделить ViewModel между несколькими фрагментами и вы используете навигационные компоненты, вы можете использовать by navGraphViewModels .

2. Поскольку я хочу отобразить подробную информацию о втором фрагменте, для меня информация должна храниться в viewmodel, но, возможно, я ошибаюсь.

Ответ №1:

Если вы хотите использовать одну и ту же модель представления для обоих фрагментов, вот одна хорошая статья об этом. Но я думаю, что это вам не подходит. Проблема в вашем случае у вас есть RecyclerView в первом фрагменте. Насколько я понимаю, каждый элемент в RecyclerView имеет свою собственную модель представления. Модели представления FragmentB и элемента recycler не могут использовать один и тот же родительский элемент. Таким образом, передача элементов выглядит более здоровой в вашем случае.

Комментарии:

1. Я думаю, что они используют подход share viewmodel.