前言
Jetpack上一篇讲完了lifecycle
(原创)Jetpack系列:lifecycle
现在我们来讲ViewModel和LiveData
他们一般是配合来使用的
ViewModel用来存储数据
LiveData来监听数据的变化
这样做的好处是把数据的操作放在ViewModel里
Activity页面只负责业务逻辑即可
ViewModel还可以防止瞬态数据丢失
例如横竖屏的时候数据不会丢失
ViewModel的创建方法
关于ViewModel的创建,有以下几种方式:
1:最原始的办法:
先创建ViewModelProvider
var viewModelProvider =
ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application))
然后创建ViewModel
var myViewModel = viewModelProvider.get(MyViewModel::class.java)
2:在fragment中有以下两种方式,创建属于当前fragment的ViewModel:
@MainThread
public inline fun <reified VM : ViewModel> Fragment.viewModels(
noinline ownerProducer: () -> ViewModelStoreOwner = {
this },
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> = createViewModelLazy(VM::class, {
ownerProducer().viewModelStore }, factoryProducer)
@MainThread
public inline fun <reified VM : ViewModel> Fragment.activityViewModels(
noinline factoryProducer: (() -> Factory)? = null
): Lazy<VM> = createViewModelLazy(
VM::class, {
requireActivity().viewModelStore },
factoryProducer ?: {
requireActivity().defaultViewModelProviderFactory }
)
使用示例:
val viewModel: HomeFragViewModel by viewModels()
val activityViewModel: HomeFragViewModel by activityViewModels()
HomeFragViewModel是你自己ViewModel的类的名字
可以看到这两个方法,一个是和fragment绑定
一个是和fragment所在的Activity绑定
所以一个Activity下的多个fragment就可以通过第二种方式实现数据通信了
内部实现其实是基于这个方法:
@MainThread
public fun <VM : ViewModel> Fragment.createViewModelLazy(
viewModelClass: KClass<VM>,
storeProducer: () -> ViewModelStore,
factoryProducer: (() -> Factory)? = null
)
点进去看,归根结底也是用ViewModelProvider(store, factory).get(viewModelClass.java)的方式去做的
3:Activity里面创建Viewmodel可以这样:
@MainThread
public inline fun <reified VM : ViewModel> ComponentActivity.viewModels(
noinline factoryProducer: ((
Jetpack ViewModel+LiveData详解

本文详细介绍了Jetpack中ViewModel和LiveData的使用方法,包括创建ViewModel的不同方式、使用LiveData监听数据变化,以及如何结合二者实现数据与业务逻辑的解耦。
最低0.47元/天 解锁文章
2814

被折叠的 条评论
为什么被折叠?



