가끔 부르기도 하지만 연격당할 위험이 있는 처리는 플로우(약)
요구 사항을 함부로 던지지 않기 위해 대응하는 방법이 재미있게 발전할 것 같아서 적어놨어요.
어쨌든 코드
private val _repositoryResponseState = MutableStateFlow<List<Repo>?>(null)
private val repositoryFlow: Flow<List<Repo>?> = _repositoryResponseState.transform {
if (it == null) {
val response = repository.getRepo("sobaya-0141")?.body()
_repositoryResponseState.value = response
emit(response)
} else {
emit(it)
}
}
fun getRepo(user: String) {
viewModelScope.launch {
val test = repositoryFlow.firstOrNull()
print(test?.size)
}
}
내용은 StateFlow_repositoryResponseState
가 있고 일단 요구를 하면 특별한 결과를 기억해야 한다._repositoryResponseState
에서 수치가 있으면 저장값을 저장값으로 바꾸고 없으면 요청을 던진다.그리고 구독
repositoryFlow
만 하거나 가격을 받습니다.이번 예는 getRepo가 연격 처리될 수 있는 입장(원래 파라미터가 없는 인상)
먼저 술을 마셨어요.
fun <T> MutableStateFlow<T?>.getOrRequest(func: (String) -> Flow<Response<T>>): Flow<T?> =
transform { it ->
if (it == null) {
val response = func("sobaya-0141").firstOrNull()?.body()
response?.let { response ->
value = response
}
emit(response)
} else {
emit(it)
}
}
요정이 이런 확장 함수를 준비했다.class MainViewModel(private val repository: GithubRepository) : ViewModel() {
private val repositoryResponseState = MutableStateFlow<List<Repo>?>(null).getOrRequest {
repository.getRepo(it)
}
fun getRepo(user: String) {
viewModelScope.launch {
val test = repositoryResponseState.firstOrNull()
print(test?.size)
}
}
}
fun <T> MutableStateFlow<T?>.getOrRequest(func: (String) -> Flow<Response<T>>): Flow<T?> =
transform { it ->
if (it == null) {
val response = func("sobaya-0141").firstOrNull()?.body()
response?.let { response ->
value = response
}
emit(response)
} else {
emit(it)
}
}
원래 Repository는suspend fun이었으나 확장 함수에 맡겼을 때suspend fun에게 욕을 먹고 부를 수밖에 없어 타협했다.플로우 안이라서 좋아요!!그렇게 생각해도 날 용서하지 않아
요정설
최초의 문법에 비해 확장 함수 하나만 준비하면 상당히 수월하다.
돌아보다
여기까지 쓰면 State Flow의 장점을 죽일 것 같아서요.
모처럼 State Flow를 Flow로 반납하면 패키지를 원하면서 값이 나갈 때 소용이 없다.
가격 설정과 인출, 특히 따로 진행하면...
하지만 나는 솔직하게
repositoryFlow
쓰면 된다고 생각했고 이런 글자를 쓸 필요도 없었다.결론은 술의 힘이 무섭다는 거예요.
Reference
이 문제에 관하여(가끔 부르기도 하지만 연격당할 위험이 있는 처리는 플로우(약)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sobya/articles/ce6d7341c1bce6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)