用于实例化 ViewModel 的首选 Fragment 生命周期方法

neb*_*hie 9 android android-fragments android-livedata android-viewmodel android-architecture-components

android-architecture-components/GithubBrowserSample 存储库中,Fragment#onViewCreated生命周期方法用于ViewModel实例化(具有Fragment范围),用于Fragment使用数据绑定 + LiveData+组合的s ViewModel

来自SearchFragment.kt该回购 ^:

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

是否有任何官方的指南或共识哪个这些Fragment生命周期方法,如onAttachonCreateonViewCreated,或者onActivityCreated是实例化的最佳/最安全的地方FragmentViewModel使用ViewModelProviders.of(fragment, viewModelFactory)方法?(考虑到数据绑定 +LiveData组合,如果这有区别的话)

试图理解将ViewModel实例化放入任何早期生命周期方法(例如onAttach/ )的一般优点/缺点onCreatesuper当然是在调用之后)。

提前致谢。

Epi*_*rce 6

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    searchViewModel = ViewModelProvider().get(this, viewModelFactory)
Run Code Online (Sandbox Code Playgroud)

这是正确的,常见的错误往往是用于观察 LiveData 的生命周期所有者。

    // also in onViewCreated
    searchViewModel.observe(viewLifecycleOwner) { items ->
        ....
    }
Run Code Online (Sandbox Code Playgroud)


Onu*_* D. 4

据我所知,两者没有直接的优势,因为 #onViewCreated 在 #onCreateView 完成后立即被调用。根据文档:

void onViewCreated(视图视图,捆绑包savedInstanceState)

在 onCreateView(LayoutInflater, ViewGroup, Bundle) 返回后、但在任何保存的状态恢复到视图之前立即调用。这使得子类有机会在知道其视图层次结构已完全创建后进行自身初始化。然而,片段的视图层次结构此时并未附加到其父级。

我通常更喜欢将所有初始化(如果与我的视图层次结构无关)放入 #onViewCreated 方法中。对我来说这从来都不是问题。