Компонент навигации мешает воссоздать фрагмент при нажатии на кнопку

Я использую 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
    }