ViewModelについて知っておくべきこと

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して14日目です。クリックしてイベントの詳細をご覧ください

この記事では、主にViewModelを使用するための基本的なスキルについて説明します

1.ViewModelコンストラクターは着信アプリケーションをサポートします

ViewModelの継承をカスタマイズしAndroidViewModelます:

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

getApplication()メソッドを介してアプリケーションを取得できます。

2. ViewModelコンストラクターは、他の型パラメーターの受け渡しをサポートします

ViewModelは、特定のViewModelタイプを作成するためのファクトリクラスの受け渡しをサポートしているため、カスタムファクトリクラスを直接継承ViewModelProvider.Factoryし、ViewModelを作成するときにカスタムファクトリクラスを渡します。

たとえば、MainViewModelサポートする次の構築パラメーターは、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)
    }
}
复制代码

カスタムCustomVMFactoryファクトリクラスもActivityを渡して、默认工厂カスタムファクトリクラスがViewModelを作成できない場合に、元のActivityデフォルトファクトリに渡されて処理されるようにする必要があることがわかります。これは、1つ兜底作用に相当します。基本的に静的プロキシパターンの実装を反映しています。

次のように使用します。

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

3.ViewModelでのLiveDataの使用に関する注意

一般に、ViewModelでLiveDataを次のように定義します。

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

data1追加のメンバー変数とメンバーメソッドを宣言することにより、不変性を外界に公開しました。

image.png

逆コンパイルされたコードから判断すると、実際には、追加で宣言されたプロパティはまったく必要ありませんgetData1。不変のLiveDataを取得するためのメソッドのみが必要です。

したがって、次のように変更できます。

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

逆コンパイルして効果を確認します。

image.png

逆コンパイルされたコードからわかるように、、暴露不可变的LiveData只额外声明了一个方法は余分なプロパティの宣言を減らします。

4.ViewModelでのコルーチンの使用

依存関係implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"は、ViewModelのコルーチン拡張プロパティを提供します。viewModelScope

image.png

次に、viewModelScopeプロパティを直接使用して耗时操作合計を実行でき线程切换ます。

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

おすすめ

転載: juejin.im/post/7086607125949972487