#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.