😸
登録系の画面でのFlowの活用法
登録系の画面で自分の好きな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()
することで、ボタンの活性/非活性を切り替えたりする方が一般的な使い方かと思います。
※自分もそうしてます。(なんでこんなサンプルを作ったのか自分でも不明)
サンプルプロジェクト
Discussion