kotlin 如何在不同片段的自定义视图之间共享ViewModel?

qxsslcnc  于 2023-05-07  发布在  Kotlin
关注(0)|答案(1)|浏览(339)

我有一个包含2个片段的活动,每个片段包含各种自定义视图。
如何在这些自定义视图之间共享ViewModel?
碎片

private val mainViewModel: MainViewModel by activityViewModels()
  • 自定义视图-
private val mainViewModel by lazy {
    ViewModelProvider(findViewTreeViewModelStoreOwner()!!).get<MainViewModel>()
}

问题是**findViewTreeViewModelStoreOwner()**返回Fragment而不是Activity,从而创建新的ViewModel而不是共享现有的ViewModel。
是否有任何方法可以在自定义视图之间共享活动视图模型?

wlwcrazw

wlwcrazw1#

发生这种情况是因为自定义视图中的findViewTreeViewModelStoreOwner()返回Fragment而不是Activity,因为您的视图已附加到Fragment,因此此方法返回Fragment。
您可以尝试将ViewActivity显式转换为ViewModelStoreOwner,并从使用本练习创建的ViewModelProvider中获取ViewModel。然后,必须返回Activity的ViewModel(Kotlin会自动将Activity类型转换为ViewModelStoreOwner,但只是为了清楚起见):

// Your Activity:
private val mainViewModel by viewModels<MainViewModel>()

// Your custom views:
private val mainViewModel by lazy {
    ViewModelProvider(activity as ViewModelStoreOwner).get<MainViewModel>()
}

相关问题