Жизненный цикл компонента навигации - PullRequest
1 голос
/ 25 июня 2019

Я уже некоторое время испытываю компонент навигации, но почему-то не понимаю причины (или объяснения) текущего жизненного цикла компонента навигации.Вот некоторые моменты, требующие уточнения.

1.Поток от фрагмента к фрагменту

В компоненте навигации каждый фрагмент (или, скажем, страница) воссоздается при каждом посещении (или повторном посещении).Таким образом, когда вы находитесь на A и переходите к B, A уничтожается, а позже, когда вы возвращаетесь к A (как нажатие кнопки назад), * ​​1009 * создается с натяжением.

В традиционных шаблонах действий, когда вы возвращаетесь к A, он просто переходит к onResume, поскольку не был уничтожен при переходе к B.Любая причина, по которой этот шаблон изменяется в компоненте навигации?

Проблема воссоздания заключается в том, что когда у вас много данных, и для перерисовки требуется время, и кажется, что приложение зависает.Примером может служить простая HomePage (скажем, Facebook NewsFeed).Сохранение данных может быть обработано с помощью ViewModel, но для отрисовки всех каналов снова требуется время, и оно замерзнет.

Существует еще одна проблема, порождаемая отдыхом.Предположим, этот сценарий: A имеет Collapsing AppBar с NestedScrollView.Пользователь прокручивает страницу вниз и AppBar сворачивается, а затем пользователь переходит на другую страницу B.Когда он вернется к A, он будет перерисован, а AppBar расширен.Я не уверен, что это ошибка или я должен что-то сделать, чтобы это исправить?Так что любое решение здесь также приветствуется.

2.Активный отдых

Если активность воссоздается по определенным причинам, таким как изменение ориентации, каждая страница в компоненте навигации воссоздается до текущего пункта назначения.Хотя вызывается onCreate метод Fragment, а не onCreateView, я не вижу смысла создавать фрагменты в воссоздании Activity.Любое объяснение будет приветствоваться.

1 Ответ

2 голосов
/ 26 июня 2019

Компонент навигации теперь поддерживает только замену фрагментов. Таким образом, вы не сможете добавить () фрагмент, как это делается с помощью транзакции фрагмента вручную.

Однако, если вы беспокоитесь о перекачке макета и повторном извлечении данных для фрагмента, это может быть легко решено с помощью следующих двух методов.

После создания представления сохраните его в переменной и используйте всякий раз, когда вызывается onCreateView ().

private var view: View? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    if (view == null) {
        view = inflater.inflate(R.layout.fragment_list, container, false)
                //...
    }

    return view

 }

Источник: https://twitter.com/ianhlake/status/1103522856535638016

Используйте ViewModel с фрагментом и храните данные, необходимые в качестве переменной-члена. Таким образом, данные не очищаются при замене соответствующего фрагмента. ViewModel очищается только для onDestroy () фрагмента, что произойдет только тогда, когда вы уничтожите родительское действие. https://developer.android.com/images/topic/libraries/architecture/viewmodel-lifecycle.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...