Компонент навигации мешает воссоздать фрагмент при нажатии на кнопку
Я использую Jetpack Navigation Component
в моем проекте с указанием активности и некоторыми фрагментами.
У меня есть фрагмент со списком, который заполняет со стороны сервера. Я вызываю getDataFromServer на onViewCreated
метод, затем, когда пользователь нажал на элемент, отображается новый фрагмент.
Проблема в том, что когда я нажимаю кнопку "Назад", onViewCreated вызывает снова в моем фрагменте списка.
так как я могу предотвратить повторное воссоздание моего первого фрагмента? Я не хочу onViewCreated
звонки.
4 ответа
Конечно, мы не можем предотвратить вызов oncrateView, но есть простой способ. Вместо вызова view.loadData() в onCreateView или других методах жизненного цикла мы можем вызвать его при инициализации ViewModel.
эта статья помогла мне лучше узнать ViewModel 5 распространенных ошибок при использовании компонентов архитектуры
Возможно, у вас активировали график.
app:popUpTo="@+id/nav_fingerprint_capture"
app:popUpToInclusive="true"
Вы не можете предотвратить вызов метода onViewCreated или любого метода вашего фрагмента, когда нажата кнопка "Назад", поэтому вам лучше использовать модель представления с вашим фрагментом списка и получать данные с сервера в вашей модели представления. Избегайте получения данных с сервера в вашем фрагменте, так как вы уже используете навигационный интерфейс.
Компонент навигации Jetpack заменяет фрагменты. Он не добавляет фрагменты в стопку. Поэтому, когда вы открываете фрагмент B из фрагмента A и нажимаете кнопку «Назад» во фрагменте A, фрагмент B создается заново.
Если во фрагменте A есть вызов API, и вы не хотите вызывать API при каждом воссоздании фрагмента, вы можете сохранить ответ API в модели просмотра и повторно использовать ответ при воссоздании фрагмента.
Пример:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if(foodViewModel.foodDataList.isEmpty()) {
//make API call here and
//save the response in foodViewModel.foodDataList
} else {
//use the saved response from viewmodel
//and populate recyclerview
}