如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

How to share view models between fragments using Google's GithubBrowserSample approach?

我是使用 Android 架构组件的新手,所以我决定使用 GithubBrowserSample 构建我的应用程序来实现我的许多用例。但我有一个问题,我不知道用这种方法在片段之间共享视图模型的正确方法是什么。

我想共享视图模型,因为我有一个带有 viewpager 的片段,其中有 2 个片段需要观察父片段视图模型的数据

我之前是用这个实现的,基于google's documentation

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    model = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")
}

但生命周期扩展:2.2.0-alpha03 似乎已被弃用

在 GithubBrowserSample 中,他们有类似这样的东西来创建视图模型的实例,但每次似乎都是不同的实例

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private val userViewModel: UserViewModel by viewModels {
    viewModelFactory
}

而且我不知道在哪里传递 activity 范围或者我是否应该传递它。

我试过这样的东西

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private lateinit var myViewModel: MyViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    myViewModel = activity?.run {
        ViewModelProvider(this, viewModelFactory).get(MyViewModel::class.java)
    } ?: throw Exception("Invalid Activity")
}

但我得到了

kotlin.UninitializedPropertyAccessException: lateinit property viewModelFactory has not been initialized

我希望你能帮助我,我对此有点迷茫,对不起,如果我的英语不是那么好

by viewModels() 提供了一个 ViewModel,它的范围仅限于单个 Fragment。有一个单独的 by activityViewModels() 将 ViewModel 的范围限定为您的 Activity。

但是,ViewModelProviders.of(this) 的直接替换只是 ViewModelProvider(this) - 使用 lifecycle-extensions:2.2.0-alpha03 时不需要切换到 by viewModels()by activityViewModels()