登録系の画面でのFlowの活用法

1 min read読了の目安(約1100字

登録系の画面で自分の好きなFlowの使い方を書きます。

画面構成

EditTextが2個並んでるだけの画面です。

Repository

class GithubRepository(private val service: GithubService) {
    fun getRepo(user: String) = flow { emit(service.listRepos(user)) }
}

ViewModel

val userName = MutableLiveData("")
private val isCompleteUserName = userName.asFlow().map {
    it.length > 3
}

val subText = MutableLiveData("")
private val isCompleteSubText = subText.asFlow().map {
    it.length > 3
}

private val checkComplete = combine(isCompleteUserName, isCompleteSubText) { userName, subTitle ->
    userName && subTitle
}

private val request = checkComplete.flatMapLatest {
    repository.getRepo(userName.value!!)
}

init {
    request.onEach {
        it.body()?.forEach {
            print(it)
        }
    }.launchIn(viewModelScope)
}

EditTextはViewModelのuserNameとsubTextに連携してます。

isCompleteXXXにて入力チェック(今回は4桁以上)をしています。
全部の入力チェックをクリアしているかをcheckCompleteにて管理
入力チェックが終わったらrequestにて勝手にリクエストのように作っています。

今回は何故か勝手にリクエストするように作りましたが、checkComplete.asLivedata()することで、ボタンの活性/非活性を切り替えたりする方が一般的な使い方かと思います。
※自分もそうしてます。(なんでこんなサンプルを作ったのか自分でも不明)

サンプルプロジェクト

https://github.com/sobaya-0141/AllFlow/tree/input_check