在android-architecture-components/GithubBrowserSample回购中,Fragment#onViewCreated
生命周期方法被用于ViewModel
实例化(使用Fragment
的范围)用于使用数据绑定+ Fragment
+ LiveData
组合的ViewModel
s:
来自那个回购的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
之后)。
提前致谢。
据我所知,彼此并没有直接的优势,因为#onViewCreated在#onCreateView完成后立即被调用。根据文件:
void onViewCreated(视图视图,Bundle savedInstanceState)
在onCreateView(LayoutInflater,ViewGroup,Bundle)之后立即调用,但在将任何已保存的状态恢复到视图之前。这使得子类有机会在知道自己的视图层次结构已完全创建后进行初始化。但是,此时片段的视图层次结构不会附加到其父级。
我通常更喜欢将所有初始化(如果与我的视图层次结构无关)放入#onViewCreated方法中。在我的案例中,它从来都不是问题。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
searchViewModel = ViewModelProviders.of(this, viewModelFactory)
这是正确的,常见的错误往往是用于观察LiveData的生命周期所有者。
// also in onViewCreated
searchViewModel.observe(viewLifecycleOwner) { items ->
....
}