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

时间:2019-02-26 09:34:52

标签: android android-fragments android-architecture-components android-viewmodel android-livedata

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

来自该仓库的SearchFragment.kt

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

对于以下FragmentonAttachonCreateonViewCreated这样的onActivityCreated生命周期方法中的哪一个,是否有任何官方指南或共识?使用Fragment方法实例化ViewModel的{​​{1}}的最佳/最安全的地方? (考虑到数据绑定+ ViewModelProviders.of(fragment, viewModelFactory)组合,如果有所不同的话)

例如,尝试理解将LiveData实例化放入任何早期生命周期方法(例如ViewModel / onAttach)中的一般优缺点(在调用{{1 }},当然。)

谢谢。

2 个答案:

答案 0 :(得分:0)

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

  

void onViewCreated(查看视图,                   捆绑saveInstanceInstanceState)

     

在onCreateView(LayoutInflater,ViewGroup,   Bundle)已返回,但在还原任何保存状态之前   到视图。这使子类有机会初始化自己   一旦他们知道他们的视图层次结构已经完全创建。的   但是,片段的视图层次结构未附加到其父级   这一点。

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

答案 1 :(得分:0)

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

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

    // also in onViewCreated
    searchViewModel.observe(viewLifecycleOwner) { items ->
        ....
    }