实例化视图模型的首选片段生命周期方法



在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生命周期方法(如onAttachonCreateonViewCreatedonActivityCreated中哪一种是使用ViewModelProviders.of(fragment, viewModelFactory)方法实例化FragmentViewModel的最佳/最安全位置,是否有任何官方指南或共识?(给定数据绑定 +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 方法中。就我而言,这从来都不是问题。

最新更新