Ce que vous devez savoir sur ViewModel

Prenez l'habitude d'écrire ensemble ! C'est le 14ème jour de ma participation au "Nuggets Daily New Plan·April Update Challenge", cliquez pour voir les détails de l'événement .

Cet article explique principalement les compétences de base de l'utilisation de ViewModel

1. Le constructeur ViewModel prend en charge l'application entrante

Personnalisez un héritage ViewModel AndroidViewModel:

class ApplicationViewModel(app: Application) : AndroidViewModel(app) {
    //获取Applicaction
    private val mApp: Application by lazy {
        getApplication()
    }
}
复制代码

Nous pouvons getApplication()obtenir l'application via la méthode.

2. Le constructeur ViewModel prend en charge la transmission d'autres paramètres de type

ViewModel prend en charge la transmission d'une classe de fabrique pour créer un type ViewModel spécifique. Nous héritons donc directement d' ViewModelProvider.Factoryune classe de fabrique personnalisée et transmettons la classe de fabrique personnalisée lors de la création d'un ViewModel.

Par exemple, les MainViewModelparamètres de construction suivants que nous prenons en charge passent dans un type Int :

class CustomVMFactory(
    private val factory: ViewModelProvider.Factory,
    private val type: Int
) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
            return MainViewModel(type) as T
        }
        return factory.create(modelClass)
    }
}
复制代码

On peut constater que notre CustomVMFactoryclasse d'usine personnalisée doit également passer dans une activité 默认工厂pour garantir que lorsque notre classe d'usine personnalisée ne peut pas créer de ViewModel, elle sera transmise à l'usine par défaut Activity d'origine pour traitement, ce qui équivaut à un 兜底作用, qui reflète essentiellement une implémentation du modèle de proxy statique.

Utilisez comme suit :

private val mVM by viewModels<MainViewModel> {
    CustomVMFactory(
        defaultViewModelProviderFactory,
        5
    )
}
复制代码

3. Notes sur l'utilisation de LiveData dans ViewModel

Généralement, nous définissons LiveData dans ViewModel comme ceci :

//私有可变
private val data: MutableLiveData<Response<String>> = MutableLiveData()
//对外暴漏不可变
val data1: LiveData<Response<String>> get() = data
复制代码

Nous avons exposé l'immuabilité au monde extérieur data1en déclarant une variable membre supplémentaire et une méthode membre :

image.png

À en juger par le code décompilé, en fait, les propriétés déclarées en plus ne sont pas du tout nécessaires, nous n'avons besoin que getData1de la méthode pour obtenir l'immuable LiveData.

Donc on peut le changer comme ça :

//对外暴漏不可变
val data1: LiveData<String> get() =  MutableLiveData()
复制代码

Décompilez pour voir l'effet :

image.png

Comme vous pouvez le voir dans le code décompilé, 暴露不可变的LiveData只额外声明了一个方法, réduit la déclaration d'une propriété supplémentaire.

4. Utilisation de coroutines dans ViewModel

La dépendance implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"fournit une propriété d'extension de coroutine pour ViewModel :viewModelScope

image.png

On peut alors utiliser viewModelScopedirectement les propriétés pour effectuer la 耗时操作somme 线程切换:

fun request() {
    viewModelScope.launch(Dispatchers.IO) {
        //执行耗时代码,比如网络请求
    }
}
复制代码

Je suppose que tu aimes

Origine juejin.im/post/7086607125949972487
conseillé
Classement