👻

Flowの値が変わったらRequestを投げる

2021/01/15に公開

DataBindingでStateFlowが使えるようになり今後需要が増えそうなので、
試してみました。

想定した状況

switchなどの切り替えで一覧の表示内容を変更する。

Repository

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

ユーザ名の文字列を受け取ったらリクエストを投げて一覧データを取得します。

ViewModel

class MainViewModel(private val repository: GithubRepository) : ViewModel() {

    val _user = MutableStateFlow("")
    private val user: Flow<String> = _user
    private val resFlow = user.flatMapLatest {
        repository.getRepo(it)
    }

    init {
        viewModelScope.launch {
            resFlow.collect { res ->
                if (res.isSuccessful) {
                    res.body()?.forEach {
                        println(it.name)
                    }
                }
            }
        }
    }
}

_userのStateFlowに画面で設定された文字をセットします。
ここが想定環境に書いたswitchなどの条件を設定する物です。

resFlowが一覧取得リクエストのFlowになります。
user.flatMapLatestここで_userに設定された値が変更されたら一覧取得のリクエストを投げるようにしています。

今回はDataBindingでの連携をしていませんが、
凄い幸せになれそうな気がしています。

サンプルプロジェクト

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

Discussion