获取viewModel的几种方式

1,207 阅读1分钟

ViewModelProvider:这是获取 ViewModel 最常见和推荐的方式。您可以使用 ViewModelProvider 类来创建和管理 ViewModel 实例。在 Activity 或 Fragment 中,可以通过以下方式获取 ViewModel:

ViewModelProvider viewModelProvider = new ViewModelProvider(this);
YourViewModel viewModel = viewModelProvider.get(YourViewModel.class);

当然,你也可以选择引入 activity-ktx ,从而以更简便的写法去写:

implementation 'androidx.activity:activity-ktx:1.5.1'

private val mainModel by viewModels<MainViewModel>()

ComposeViewModel的使用和Jetpack一致,通常我们构建页面的时候,如果一条数据多个布局都需要使用到的话我们只能在方法的形参中层层传递。但是这样明显是不合理的,会降低代码的可读性。

使用ViewModel可以完美的解决这个问题,Compose中使用ViewModel的话需要引入lifecycle-viewmodel-compose库,获取ViewModel的方式需要用到扩展函数:viewModel()

多个@Composable修饰的函数里面使用viewModel()获取ViewModel可以获取到同一个ViewModel对象,这就是我们能解决问题的根本原因

以上所说仅限于同一个导航页中。如果是在不同的导航页中,那么获取到的ViewModel是不同的对象,这一点跟我们不同Activity中获取不同ViewModel是一样的

依赖支持

implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:1.0.0-alpha07'

代码

@Composable
fun useWithViewModel() {
    val datas = remember {
        mutableStateListOf(
            ItemData(title = "向ViewModel中的值自增1并展示", content = "0")
        )
    }
    val model: ExampleViewModel = viewModel()//获取ViewModel对象
    Scaffold(topBar = {
        buildTopBar(title = "Compose和ViewModel的结合")
    }) {
        ListView(
            datas = datas,
            state = rememberLazyListState(),
            click = { itemData: ItemData, index, _ ->
                model.increase()//ViewModel中对象自增1
                itemData.content = model.count.toString()//刷新数据
                changeData(datas, index)
            })
    }
}

ExampleViewModel对象

class ExampleViewModel: ViewModel() {
    fun increase() {
        count++
    }

    var count =0
}

参考:

  1. # 由浅入深,详解 ViewModel 的那些事
  2. # Jetpack Compose中ViewModel、Flow、Hilt、Coil的使用