(原创)Jetpack系列(二):ViewModel+LiveData

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

前言

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: ((
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值