在android-architecture-components/GithubBrowserSample 存储库中,Fragment#onViewCreated
生命周期方法用于ViewModel
实例化(具有Fragment
的作用域),用于使用数据绑定+LiveData
+ViewModel
组合的Fragment
:
从该回购的SearchFragment.kt
^:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
searchViewModel = ViewModelProviders.of(this, viewModelFactory)
...
}
对于这些Fragment
生命周期方法(如onAttach
、onCreate
、onViewCreated
或onActivityCreated
中哪一种是使用ViewModelProviders.of(fragment, viewModelFactory)
方法实例化Fragment
ViewModel
的最佳/最安全位置,是否有任何官方指南或共识?(给定数据绑定 +LiveData
组合,如果这有所作为)
尝试理解将ViewModel
实例化放入任何早期生命周期方法(例如onAttach
/onCreate
)的一般优点/缺点(当然,在调用super
之后)。
提前谢谢。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
searchViewModel = ViewModelProvider().get(this, viewModelFactory)
这是正确的,常见的错误往往是生命周期所有者用于观察 LiveData。
// also in onViewCreated
searchViewModel.observe(viewLifecycleOwner) { items ->
....
}
据我所知,彼此之间没有直接的优势,因为 #onViewCreated 在完成后立即被调用 #onCreateView。根据文档:
void onViewCreated (View view, 捆绑包保存实例状态)
在onCreateView(LayoutInflater,ViewGroup, 捆绑包)已返回,但在 中恢复任何保存的状态之前 到视图。这给了子类一个初始化自己的机会 一旦他们知道他们的视图层次结构已完全创建。这 但是,片段的视图层次结构不会附加到其父级 这一点。
我通常更喜欢将所有初始化(如果与我的视图层次结构无关)放入 #onViewCreated 方法中。就我而言,这从来都不是问题。