繁体   English   中英

ViewModelProviders 已经过时了,应该换什么?

[英]ViewModelProviders is outdated, what should be replaced?

我使用ViewModelProviders 但是今天,更新图书馆后,有30条消息。 据我了解ViewModelProviders不再可用并且您需要替换它,我查看了 developer.google 但不明白要替换什么? 我的代码:

inline fun <reified T : ViewModel> FragmentActivity.injectViewModel(factory: ViewModelProvider.Factory): T {
    return ViewModelProviders.of(this, factory)[T::class.java]
}

inline fun <reified T : ViewModel> Fragment.injectViewModel(factory: ViewModelProvider.Factory): T {
    return ViewModelProviders.of(this, factory)[T::class.java]
}

你能解释一下为什么它已经过时了吗?

根据文档

使用by viewModels() Kotlin 属性委托或ViewModelProvider.ViewModelProvider(ViewModelStoreOwner, Factory) ,传入片段和工厂。

因此,您可以将扩展替换为:

inline fun <reified T : ViewModel> FragmentActivity.injectViewModel(factory:  ViewModelProvider.Factory): T {
    return ViewModelProvider(this, factory)[T::class.java]
}

inline fun <reified T : ViewModel> Fragment.injectViewModel(factory: ViewModelProvider.Factory): T {
    return ViewModelProvider(this, factory)[T::class.java]
}

而且,根据错误消息,您可以在fragment-ktxactivity-ktx依赖项中使用 Kotlin 属性扩展,并完全删除您的扩展方法。

即, by viewModels和片段by activityViewModels视图模型:

// Retrieve the ViewModel associated with this Fragment
val viewModel: MyVewModel by viewModels { myFactory }

// Retrieve the ViewModel associated with the activity
val activityViewModel: MyVewModel by activityViewModels { myFactory }

或者,如果您从 Activity 本身访问 ViewModel,则可以by viewModels使用它:

// In an Activity, you can retrieve a ViewModel scoped to the Activity
// by using viewModels
val viewModel: MyVewModel by viewModels { myFactory }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM