Метод жизненного цикла предпочтительного фрагмента для создания экземпляров ViewModels - PullRequest
0 голосов
/ 26 февраля 2019

В репозитории android-Architecture-components / GithubBrowserSample метод жизненного цикла Fragment#onViewCreated используется для реализации ViewModel (с областью действия Fragment * )для Fragment s, которые используют комбинацию привязки данных + LiveData + ViewModel:

С SearchFragment.kt этого репо ^:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        searchViewModel = ViewModelProviders.of(this, viewModelFactory)
        ...
    }

Есть ли официальные рекомендацииили согласие относительно того, какой из этих Fragment методов жизненного цикла, таких как onAttach, onCreate, onViewCreated или onActivityCreated, является лучшим / самым безопасным местом для создания Fragment ViewModel с использованием ViewModelProviders.of(fragment, viewModelFactory) метод?(учитывая комбинацию данных + LiveData, если это имеет значение)

Попытка понять общие преимущества / недостатки размещения ViewModel экземпляров в любом из ранних методов жизненного цикла, таких как onAttach/ onCreate, например (после звонка super, конечно).

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    searchViewModel = ViewModelProviders.of(this, viewModelFactory)

Это правильно, распространенной ошибкой обычно является владелец жизненного цикла, используемый для наблюдения LiveData.

    // also in onViewCreated
    searchViewModel.observe(viewLifecycleOwner) { items ->
        ....
    }
0 голосов
/ 26 февраля 2019

Насколько я знаю, прямого преимущества одного перед другим нет, поскольку #onViewCreated вызывается сразу после завершения #onCreateView.Согласно документам:

void onViewCreated (представление View, BundlevedInstanceState)

Вызывается сразу после возврата onCreateView (LayoutInflater, ViewGroup, Bundle), но до того, как сохраненное состояние быловосстановлен в вид.Это дает подклассам возможность инициализировать себя, как только они узнают, что их иерархия представления полностью создана.Однако на этом этапе иерархия представления фрагмента не привязана к его родительскому элементу.

Обычно я предпочитаю помещать все инициализации (если они не связаны с моей иерархией представления) в метод #onViewCreated.В моем случае это никогда не было проблемой.

...