LiveDataの別のMutableLiveデータのサブクラスがあるのか?

8060 ワード

LiveData ライブラリは、データ型にかかわらずシームレスにデータ更新としてUIを更新することができます.これは、2009年に大きな追加ですDRY Principle 同様に.また、それは開発者のためのこの偉大な選択肢を作るViewModelライブラリと完全にうまく動作します.
場合は、ViewModelライブラリを知らない場合は、それに私の古い記事をチェックアウトしてください.


用途


依存


LiveDataを使用するには、androidx-lifecycle 図書館.
dependencies {
    // LiveData
    def lifecycle_version = "2.2.0"
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
}

実装


LiveDataには2つの実装があります.

  • MutableLiveData それは変わりやすく、

  • LiveData それは不変です.
  • LiveDataの別のmutableLivedataサブクラスがなぜあるか。


    10月18日
    コメント: 1
    回答:3
    104

    どうもMutableLiveDataLiveData だけ作ることによってsetValue() and postValue() メソッドpublic、LiveData 彼らは保護されている.
    この変更のための別のクラスを作る理由は何ですかLiveData それ自体?
    一般的に言って、そういうことです.
    Open Full Question

    MutableLiveDataの使用


    我々は、ライブラリの使用方法を示すために、単純なカウンタアプリを作成されます.ViewModelライブラリと他のプロジェクトと同様のパターンで使用できます.
    こちらはこちらactivity_main.xml 以下のようになります.
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:textSize="40sp"
            app:layout_constraintBottom_toTopOf="@+id/button"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    ここで、カウンタ値を格納し、ボタンを押してインクリメントする変数を作成します.この変数はMutableLiveData<Int> を返します.MutableLiveData 初期値のコンストラクタを持つクラス.
    var counter: MutableLiveData<Int> = MutableLiveData(0)
    
    LiveDataオブジェクトの値は、value property .
    今、私たちはobserve メソッドの値を更新するたびにいくつかの特定のアクションを行う.これはクラスの所有者とObserver 我々が我々の行動を定めることができる機能.
    ViewBindingを使用してGUIコンポーネントと対話します.場合は、トピックを知らない場合は、それ以上の私の記事をチェックアウトすることができます.


    counter.observe(this, Observer {
         binding.textView.text = counter.value.toString()
    })
    
    そして、実際にカウンタをインクリメントするためにボタンにロジックを実装する必要があります.
    binding.button.setOnClickListener {
        counter.value?.let {
            counter.value = it + 1
        }
    }
    
    ここではMainActivity.kt 私の場合を見る
    package dev.theimpulson.livedataexample
    
    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.lifecycle.MutableLiveData
    import androidx.lifecycle.Observer
    import dev.theimpulson.livedataexample.databinding.ActivityMainBinding
    
    class MainActivity : AppCompatActivity() {
        private lateinit var binding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            val counter: MutableLiveData<Int> = MutableLiveData(0)
    
            counter.observe(this, Observer {
                binding.textView.text = counter.value.toString()
            })
    
            binding.button.setOnClickListener {
                counter.value?.let {
                    counter.value = it + 1
                }
            }
        }
    }
    
    これで我々のアプリが完了です.ボタンをクリックするとすぐにUIがインクリメントされます.

    LiveDataの使用


    私が以前に述べたように、LiveDataは不変です.したがって、値を設定することはできません.オブジェクトを観測できるようにするのであれば、プライベートなセッターを使用したい場合は特に便利です.
    現在のケースでは、どうすればよいかを示します.
    private val _counter: MutableLiveData<Int> = MutableLiveData(0)
    
    fun counter(): LiveData<Int> {
        return _counter
    }
    
    counter().observe(this, Observer {
        binding.textView.text = counter().value.toString()
    })
    
    binding.button.setOnClickListener {
        _counter.value?.let {
             _counter.value = it + 1
        }
    }
    
    私が作ったことに気づく_counter どの種類のMutableLiveData プライベートクラスで、クラスに制限されます.人がその値を観察したい場合、彼らはcounter() 型の関数LiveData 誰のセッターが個人的であるか.これはクラスの外側のカウンタの値を変更できないことを保証します.私はあなたがLiveDataを使用できる方法をクリア願っています.
    これらは非常に短い例でしたが、このライブラリが開発者のためにどれだけ強力で役に立ちますか.私は両方のライブラリを最大限に活用するためにViewModelと一緒にLiveDataを使用することをお勧めします.