在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)
...
}
对于以下Fragment
,onAttach
,onCreate
或onViewCreated
这样的onActivityCreated
生命周期方法中的哪一个,是否有任何官方指南或共识?使用Fragment
方法实例化ViewModel
的{{1}}的最佳/最安全的地方? (考虑到数据绑定+ ViewModelProviders.of(fragment, viewModelFactory)
组合,如果有所不同的话)
例如,尝试理解将LiveData
实例化放入任何早期生命周期方法(例如ViewModel
/ onAttach
)中的一般优缺点(在调用{{1 }},当然。)
谢谢。
答案 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 ->
....
}