Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Livedata Basics

Livedata Basics

keijumt

May 31, 2019
Tweet

More Decks by keijumt

Other Decks in Technology

Transcript

  1. Launch onCreate onStart onResume onPause onStop onDestroy Lifecycle State INITIALIZED

    CREATED STARTED RESUMED STARTED CREATED DESTROYED ライフサイクルが アクティブ
  2. Launch onCreate onStart onResume onPause onStop onDestroy Lifecycle State INITIALIZED

    CREATED STARTED RESUMED STARTED CREATED DESTROYED ライフサイクルが インアクティブ
  3. Launch onCreate onStart onResume onPause onStop onDestroy Lifecycle State INITIALIZED

    CREATED STARTED RESUMED STARTED CREATED DESTROYED ライフサイクルが 破棄される
  4. ViewModel class MainViewModel { val name = MutableLiveData<String>() init {

    name.value = "Hoge" } } nameを監視しているObserverに通知を送信
  5. ViewModel class MainViewModel { val name = MutableLiveData<String>() init {

    name.postValue("Hoge") } } UIスレッド以外から通知を送る場合はpostValueを利用
  6. ViewModel class MainViewModel { val name = MutableLiveData<String>("Huga") init {

    name.value = "Hoge" } } 初期値を入れたい場合は第一引数に
  7. Activity class MainActivity : AppCompatActivity() { override fun onCreate( …

    ) { val viewModel = MainViewModel() viewModel.name.observe(this, Observer { name -> }) } }
  8. Activity class MainActivity : AppCompatActivity() { override fun onCreate( …

    ) { val viewModel = MainViewModel() viewModel.name.observe(this, Observer { name -> }) } }
  9. Activity class MainActivity : AppCompatActivity() { override fun onCreate( …

    ) { val viewModel = MainViewModel() viewModel.name.observe(this, Observer { name -> }) } }
  10. Activity class MainActivity : AppCompatActivity() { override fun onCreate( …

    ) { val viewModel = MainViewModel() viewModel.name.observe(this, Observer { name -> }) } } 第一引数はどのライフサイクル(LifecycleOwner)に合わせるか
  11. Activity class MainActivity : AppCompatActivity() { override fun onCreate( …

    ) { val viewModel = MainViewModel() viewModel.name.observe(this, Observer { name -> }) } } 第二引数はオブザーバ、通知を受けた時にここが呼ばれる
  12. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } }
  13. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } }
  14. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } }
  15. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } }
  16. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } } 監視するLiveDataを第一引数に設定
  17. Transformations#map class MainViewModel( … ) { val animals = MutableLiveData<List<Animal>>()

    val cats : LiveData<List<Animal>> = Transformations.map(animals) { animals -> animals.filter { it.type == Animal.Type.Cat } } init { animals.value = animalRepository.getAnimals() } } 受け取ったデータを整形して返却する
  18. Transformations#switchMap class MainViewModel( … ) { val type = MutableLiveData<Animal.Type>()

    val filterdAnimals : LiveData<List<Animal>> = Transformations.switchMap(type) { type -> animalRepository.getAnimalsByType(type) } init { animalType.value = Animal.Type.Cat } }
  19. Transformations#switchMap class MainViewModel( … ) { val type = MutableLiveData<Animal.Type>()

    val filterdAnimals : LiveData<List<Animal>> = Transformations.switchMap(type) { type -> animalRepository.getAnimalsByType(type) } init { animalType.value = Animal.Type.Cat } }
  20. Transformations#switchMap class MainViewModel( … ) { val type = MutableLiveData<Animal.Type>()

    val filterdAnimals : LiveData<List<Animal>> = Transformations.switchMap(type) { type -> animalRepository.getAnimalsByType(type) } init { animalType.value = Animal.Type.Cat } }
  21. Transformations#switchMap class MainViewModel( … ) { val type = MutableLiveData<Animal.Type>()

    val filterdAnimals : LiveData<List<Animal>> = Transformations.switchMap(type) { type -> animalRepository.getAnimalsByType(type) } init { animalType.value = Animal.Type.Cat } }
  22. Transformations#switchMap class MainViewModel( … ) { val type = MutableLiveData<Animal.Type>()

    val filterdAnimals : LiveData<List<Animal>> = Transformations.switchMap(type) { type -> animalRepository.getAnimalsByType(type) } init { animalType.value = Animal.Type.Cat } } getAnimalsByTypeの戻り値はLiveData<List<Animal>>
  23. バッキングプロパティを利用 class MainViewModel { private val _name = MutableLiveData<String>() val

    name: LiveData<String> = _name } 外部に公開するのはLiveData型のメンバ変数
  24. viewLifecycleOwnerを使う class MainFragment : Fragment() { override fun onCreateView( …

    ): View { val viewModel = MainViewModel() viewModel.name.observe(viewLifecycleOwner, Observer { }) return ... } }
  25. viewLifecycleOwnerを使う class MainFragment : Fragment() { override fun onCreateView( …

    ): View { val viewModel = MainViewModel() viewModel.name.observe(viewLifecycleOwner, Observer { }) return ... } }
  26. Transformationsを初期化時以外で利用する class MainViewModel ( ... ){ var cats = MutableLiveData<List<Animal>>()

    fun getFilterName() { cats = Transformations.map(animalRepository.getAnimals()) { } } } オブザーバは以前のものを解除していない