ViewModel的使用(三)ViewModelProvider.Factory的使用

文章目录

    • 一、前言
    • 二、示例
    • 三、参考链接

一、前言

通常使用ViewModel的时候类似于以下方式

private val viewModel: BusScheduleViewModel by viewModels()

但是这种方式生成ViewModel的话,没有办法在构造函数中传递参数。所以需要使用到ViewModelProvider.Factory

二、示例

所以这里演示下如何使用

首先定义一个UserViewModel.kt

class UserViewModel(userType: String): ViewModel() {
}

其次定义一个工厂类UserViewModelFactory.kt

class UserViewModelFactory(
    private val type: String
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return UserViewModel(type) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

使用方式如下:

private val viewModel: UserViewModel by viewModels {
    UserViewModelFactory(
        "0"
    )
}

不过上述的话需要每一个ViewModel都要写一个Factory,可以使用反射来简化一下

class UserViewModelFactory(
    private val type: String
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return modelClass.getConstructor(String::class.java).newInstance(type)
    }
}

三、参考链接

  1. ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者

    https://blog.csdn.net/qq_43377749/article/details/100856599

  2. androidRoom 和 Flow 简介

    https://developer.android.google.cn/codelabs/basic-android-kotlin-training-intro-room-flow?continue=https%3A%2F%2Fdeveloper.android.google.cn%2Fcourses%2Fpathways%2Fandroid-basics-kotlin-unit-5-pathway-1%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-training-intro-room-flow#5

你可能感兴趣的:(JetPack,jetpack)