가끔 부르기도 하지만 연격당할 위험이 있는 처리는 플로우(약)

2726 단어 AndroidKotlinflowtech
사용 빈도는 낮지만 악의적인 연격 처리가 있을 때
요구 사항을 함부로 던지지 않기 위해 대응하는 방법이 재미있게 발전할 것 같아서 적어놨어요.

어쨌든 코드


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쓰면 된다고 생각했고 이런 글자를 쓸 필요도 없었다.
결론은 술의 힘이 무섭다는 거예요.

좋은 웹페이지 즐겨찾기