iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Mobile Development

Andoroid - Kotlin筆記 (新)系列 第 10

[Day10] Android - Kotlin筆記:JetPack - LiveData & Lifecycle KTX

LiveData KTX

首先要在app的build.gradle加入:

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-alpha03")
}

這篇主要會介紹:

  • ViewModel scope
  • liveData & emit()
  • switchMap
  • emitSource
    這四個功能。

ViewModel scope

這是在ViewModel中最方便使用coroutine(協程)的方式之一,
使用viewModelScope來執行耗時工程時,
會隨著ViewModel被清除而自動取消。

使用方式:

class MyViewModel : ViewModel() {

    init {
        viewModelScope.launch {
            //做某些事 例如callApi
            callApi()
        }    
    }
}

liveData & emit()

以往我們在更新LiveData時,在ViewModel中的做法為:

//沒有liveData KTX的寫法
class MyViewModel : ViewModel() {
    private val _result = MutableLiveData<String>()
    val result: LiveData<String> = _result

    init {
        viewModelScope.launch {
            val apiResult = callApi()
            _result.value = apiResult
          }
      }
  }

使用方式:

//KTX寫法
class MyViewModel : ViewModel() {
    val result = liveData {
        emit(callApi())
    }
}

這方式可以直接取得immutable(不可變的) LiveData
並透過emit提交改變。
比以前的_result.value = apiResult_result.postValue(apiResult)
更為簡單明瞭。

覺得寫法上變的簡單很多> <


switchMap

當我們需要在LiveData發生變化後,啟動coroutine(協程)時,會使用switchMap
例如:當你需要在得到使用者登入得到token後,刷新首面的api

使用Transformations.switchMap十分方便:

    private val token = MutableLiveData<String>()
    //得到token時才執行
    val result = token.switchMap { token -> 
        liveData { emit(reloadHomePageApi(token)) }
    }

result是一個immutable LiveData
在每次token更新時,result會得到一個在執行完reloadHomePageApi(token)後,
回傳的新資料。


emitSource

使用時機是:當你需要先行提交初始化value,
等成功呼叫後再回傳一次值時。
(使用頻率較小)。

使用方式:

liveData(Dispatchers.IO) {
    emit(LOADING_STRING)
    emitSource(dataSource.fetchWeather())
}

在這邊一樣只簡單列出幾個常用的方法,
如果有興趣研究更多可以看看官網的介紹喔。

參考:


上一篇
[Day9] Android : Kotlin筆記:JetPack - Fragment KTX
下一篇
[Day11] Android - Kotlin筆記:JetPack - Navigation (Fragment間的頁面跳轉)
系列文
Andoroid - Kotlin筆記 (新)18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言