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

本文介绍如何在Android开发中为ViewModel传递参数,并通过自定义ViewModelProvider.Factory实现这一过程。演示了使用Kotlin定义带参数的ViewModel及相应的工厂类,同时提供了一种使用反射简化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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值