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

问题描述 投票:0回答:2

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

来自那个回购的SearchFragment.kt ^:

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

关于FragmentonAttachonCreateonViewCreated这些onActivityCreated生命周期方法中的哪一个是使用Fragment方法实例化ViewModelViewModelProviders.of(fragment, viewModelFactory)的最佳/最安全的地方,是否有任何官方指南或共识? (给出数据绑定+ LiveData组合,如果这有所不同)

试图理解将ViewModel实例化放入任何早期生命周期方法(例如onAttach / onCreate)的一般优点/缺点(当然,在调用super之后)。

提前致谢。

android android-fragments android-architecture-components android-viewmodel android-livedata
2个回答
1
投票

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

void onViewCreated(视图视图,Bundle savedInstanceState)

在onCreateView(LayoutInflater,ViewGroup,Bundle)之后立即调用,但在将任何已保存的状态恢复到视图之前。这使得子类有机会在知道自己的视图层次结构已完全创建后进行初始化。但是,此时片段的视图层次结构不会附加到其父级。

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


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

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

    // also in onViewCreated
    searchViewModel.observe(viewLifecycleOwner) { items ->
        ....
    }
© www.soinside.com 2019 - 2024. All rights reserved.