【问题标题】:Preferred Fragment lifecycle method for instantiating ViewModels用于实例化 ViewModel 的首选片段生命周期方法
【发布时间】:2019-02-26 09:34:52
【问题描述】:

android-architecture-components/GithubBrowserSample 存储库中,Fragment#onViewCreated 生命周期方法用于 ViewModel 实例化(具有 Fragment's 范围),用于使用数据绑定+LiveData+ViewModel的组合:

来自那个 repo 的SearchFragment.kt ^:

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

对于这些Fragment 生命周期方法(例如onAttachonCreateonViewCreatedonActivityCreated)中的哪一个是实例化Fragment 的最佳/最安全的地方,是否有任何官方指南或共识?的ViewModel 使用ViewModelProviders.of(fragment, viewModelFactory) 方法? (考虑到数据绑定 + LiveData 组合,如果这有所作为)

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

提前致谢。

【问题讨论】:

  • 没有这样的规则。我在矿山上使用lazy
  • IMO 您可以在 onCreate 中初始化 Viewmodel。无论如何,你会在onViewCreated 上观察。

标签: android android-fragments android-architecture-components android-viewmodel android-livedata


【解决方案1】:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    searchViewModel = ViewModelProvider().get(this, viewModelFactory)

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

    // also in onViewCreated
    searchViewModel.observe(viewLifecycleOwner) { items ->
        ....
    }

【讨论】:

    【解决方案2】:

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

    void onViewCreated(查看视图, 捆绑 savedInstanceState)

    在 onCreateView(LayoutInflater, ViewGroup, Bundle) 已返回,但在任何已保存的状态恢复之前 到视图。这使子类有机会初始化自己 一旦他们知道他们的视图层次结构已经完全创建。这 然而,片段的视图层次结构并未附加到其父级 这一点。

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

    【讨论】:

    • 太棒了,谢谢!是的,听起来这只是选择其中一个并在整个代码库中保持一致。
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 2012-02-02
    相关资源
    最近更新 更多