[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())
}

在这边一样只简单列出几个常用的方法,
如果有兴趣研究更多可以看看官网的介绍喔。

参考:


<<:  能够滑起来的UICollectionView Day9

>>:  [Day11] 排版的小孩子才做选择 ~ Grid 跟 Flex 我全都要!

【把玩Azure DevOps】Day17 CI/CD从这里:Pipeline设定Schedule,每日晚上排程执行

现在有不少的软件会有一个特殊的版本叫Nightly,从字面上的意思就可以得知是指每个晚上发行的版本,...

# Day24--开分支免费啦!超简易开分支的方法

我还记得我学Git的时候,开始查Git是什麽,最开始出现的是下面这个画面,一堆原型的球球在上面,有的...

Day38 ( 电子元件 ) 七段显示器显示距离

七段显示器显示距离 ( TM1637 + 超音波 ) 教学原文参考:七段显示器显示距离 ( TM16...

Day3 众里寻它千百度

Filter 在海量的数据中如果想要快速找到特定关键字的资料,我们需要filter这个很实用的功能...

Day3 - Yolo? 那是什麽? 能喝吗?

(今日内容将有数学式,请谨慎服用) 今天要介绍的主角,可以说他是影响模型输出结果以及训练过程中最大的...