상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - switchMap을 사용하여 위젯 상태를 관리하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
switchMap은 리액티브 프로그래밍에서 많이 사용되는 연산자 중 하나로, 주로 RxJS 라이브러리에서 사용됩니다. Flutter나 Dart 환경에서도 RxDart와 같은 라이브러리를 통해 switchMap을 사용할 수 있습니다. switchMap은 새로운 Observable 스트림을 생성할 때 기존 구독을 취소하고 가장 마지막에 방출된 Observable만 구독하는 특징이 있어, 비동기 요청을 관리하거나 상태 변화를 효율적으로 처리하는 데 유용합니다. 위젯 상태 관리에서 switchMap을 사용하는 방법을 자세히 설명하겠습니다. --- 1. switchMap의 개념 이해하기 - switchMap(source$ → inner$) 는 source$ 스트림에서 새로운 값을 받을 때마다 기존에 구독 중이던 inner$ 스트림을 취소하고 새로 생성된 inner$ 스트림을 구독합니다. - 즉, "가장 최신의" 비동기 작업(Observable)에 집중하여 이전의 비동기 작업 결과를 무시합니다. - 이 특징 덕분에 빠르게 연속되는 사용자 입력, 네트워크 요청 취소, 중복 요청 방지 등에 매우 적합합니다. --- 2. 위젯 상태 관리에 switchMap이 쓰이는 상황 - 사용자가 입력을 할 때마다 서버에 검색 요청을 보내는 경우(debounce와 함께 사용) - 버튼을 눌러 비동기 작업을 트리거하고 이전 작업이 완료되지 않았으면 취소 - 데이터를 조회하는 요청이 변경될 때마다 최신 요청 결과만 상태로 반영 - Flutter에서 BLoC 패턴이나 ViewModel의 스트림 변환 처리 시 --- 3. switchMap을 이용한 상태 관리 방법 예시: Flutter + RxDart로 검색어에 따른 API 호출 상태 관리하기 1. BLoC 내 검색어 스트림 준비 ```dart final _searchQuerySubject = BehaviorSubject<String>(); ``` 2. 검색어 스트림에 switchMap 적용 ```dart final Stream<SearchResult> searchResults$ = _searchQuerySubject.switchMap((query) { if (query.isEmpty) { // 빈 값일 경우 빈 결과 즉시 반환 return Stream.value(SearchResult.empty()); } // API 호출 스트림 반환 (비동기) return api.search(query).asStream().onErrorReturn(SearchResult.error()); }); ``` - 여기서 매번 `_searchQuerySubject`에 <a href='https://sangseek.com/sangseeks/새로운 검색/ko'>새로운 검색</a>어가 들어오면, 이전 API 호출 스트림은 취소되고 새로운 API 요청 스트림이 구독됩니다. - 이렇게 하면 오래걸리는 이전 요청 결과가 최종 상태에 반영되는 문제를 방지할 수 있습니다. 3. UI에서는 searchResults$ 스트림을 구독해 상태 반영 ```dart StreamBuilder<SearchResult>( stream: bloc.searchResults$, builder: (context, snapshot) { if (snapshot.hasData) { return SearchResultWidget(data: snapshot.data!); } else { return CircularProgressIndicator(); } }, ); ``` 4. 검색어 변경 시 스트림에 값 추가 ```dart onChanged: (text) { bloc._searchQuerySubject.add(text); }, ``` --- 4. switchMap으로 위젯 상태를 효과적으로 관리하는 팁 - 중복 요청과 낡은 데이터 방지: switchMap은 이전 Observable을 취소하므로, 서버에 반복적으로 요청을 보내도 최신 요청 결과만 반영하여 UI 상태를 올바르게 유지할 수 있습니다. - error 처리 꼭 하기: API 호출에서 에러가 발생하면 스트림이 종료될 수 있으므로 `onErrorReturn` 또는 `catchError` 등을 사용해 에러 상태도 관리합니다. - debounce와 함께 사용: 사용자가 입력할 때 과도한 요청을 막기 위해 switchMap 앞에 debounceTime을 두면 네트워크 효율이 높아집니다. - 초기값 처리: 빈 스트림 혹은 <a href='https://sangseek.com/sangseeks/초기 상태/ko'>초기 상태</a> 값을 적절히 반환하여 초기 위젯 상태가 자연스럽게 표현되도록 합니다. - 상태 모델링: 단순 데이터뿐 아니라 로딩, 성공, 실패 상태를 구분하는 모델 클래스를 만들어 스트림에 반영하면 UI에서 상태별 처리가 편리해집니다. --- 5. 요약 switchMap을 이용해 위젯 상태를 관리하는 핵심은 다음과 같습니다: - 입력(이벤트)의 변화를 스트림으로 만들고 - 그 변화를 기반으로 비동기 작업(네트워크 등)을 다시 스트림으로 만들어 - switchMap으로 가장 최신의 비동기 작업 결과만 구독하고 - 구독된 결과 스트림을 UI에 바인딩하여 상태를 업데이트한다. 이로써 비동기 작업 중복 실행이나 낡은 상태 반영 문제를 방지하며, 반응형 UI를 깔끔하게 구현할 수 있습니다. --- 필요에 따라 Flutter의 `StreamBuilder` 혹은 RxDart, Bloc 패턴 등과 결합하여 switchMap을 활용하는 것이 일반적이며, 이 패턴은 특히 입력에 따른 서버 요청, 상태 전환 로직이 복잡한 위젯에서 매우 유용합니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기