민프
[Flutter] stream_transform 라이브러리에 대해서 알아보자 본문
먼저 Stream에 대한 사전 이해가 있어야 합니다.
Stream에 대해서 모르시는 분은 이전 포스팅을 참고해주시면 될 것 같습니다.
라이브러리 공식 홈페이지를 보면
Steam의 일반적인 변환 연산자를 추가하는 확장 방법 이라고 나와있습니다.
이 패키지를 사용하면 스트림의 데이터를 쉽게 수정, 필터링, 조합할 수 있습니다.
예를 들어, 특정 시간 동안 스트림의 이벤트를 묶거나, 스트림의 데이터를 변환하거나,
여러 스트림을 하나로 병합하는 등의 작업을 수행할 수 있습니다.
예제 코드를 보면서 설명해드리곘습니다.
예제 코드로는 stream_transform 라이브러리에서 제공하고 있는
debounce, buffter, throttle에 대해서 정리해보겠습니다.
Debounce
debounce는 스트림에서 연속적으로 발생하는 이벤트 중에서 마지막 이벤트만을 처리하고 싶을 때 사용합니다.
예를 들어, 사용자가 검색어를 입력하는 동안 연속적으로 검색 요청을 보내지 않고,
사용자가 타이핑을 멈추고 일정 시간이 지난 후에 검색 요청을 보내고 싶을 때 debounce를 사용할 수 있습니다.
코드는 아래와 같습니다.
import 'dart:async';
import 'package:stream_transform/stream_transform.dart';
void main() {
final controller = StreamController<String>();
// debounce를 사용하여 1초 동안 추가 이벤트가 없을 때 마지막 이벤트를 처리
controller.stream
.transform(debounce(Duration(seconds: 1)))
.listen((data) => print('Debounced Data: $data'));
// 스트림에 데이터 추가
controller.sink.add('H');
controller.sink.add('He');
controller.sink.add('Hel');
controller.sink.add('Hell');
controller.sink.add('Hello');
// 스트림 종료
controller.close();
}
////출력
Debounced Data: Hello
Buffer
buffer는 스트림에서 발생하는 이벤트를 일정 시간 동안 또는 특정 조건을 만족할 때까지 모아서 한꺼번에 처리하고 싶을 때 사용합니다.
코드는 아래와 같습니다.
import 'dart:async';
import 'package:stream_transform/stream_transform.dart';
void main() {
final controller = StreamController<int>();
// buffer를 사용하여 1초 동안의 이벤트를 묶어서 리스트로 출력
controller.stream
.transform(buffer(Stream.periodic(Duration(seconds: 1))))
.listen((data) => print('Buffered Data: $data'));
// 스트림에 데이터 추가
for (int i = 1; i <= 5; i++) {
controller.sink.add(i);
}
// 스트림 종료
controller.close();
}
//// 출력
Buffered Data: [1, 2, 3, 4, 5]
throttle
throttle은 스트림에서 발생하는 이벤트를 일정 시간 동안 일정 간격으로 처리하고 싶을 때 사용합니다.
예를 들어, 1초에 한 번씩만 이벤트를 처리하고 싶을 때 throttle을 사용할 수 있습니다.
import 'dart:async';
import 'package:stream_transform/stream_transform.dart';
void main() {
final controller = StreamController<int>();
// throttle을 사용하여 1초에 한 번씩만 이벤트를 처리
controller.stream
.transform(throttle(Duration(seconds: 1)))
.listen((data) => print('Throttled Data: $data'));
// 스트림에 데이터 추가
for (int i = 1; i <= 5; i++) {
controller.sink.add(i);
}
// 스트림 종료
controller.close();
}
////출력
1초에 한번씩 이벤트 고고
참고링크
'[Flutter]' 카테고리의 다른 글
[Flutter] 민감한 정보는 SharedPreferences 대신 FlutterSecureStorage를 사용하여 저장하자(android-KeyChain, IOS - KeyStore) (2) | 2023.12.20 |
---|---|
[Flutter] BLoC - 3. 목록 튜토리얼 앱에 적용해보기 (without Cubit) (4) | 2023.10.20 |
[Flutter] Bloc Concurrency 라이브러리에 대해서 알아보자 (0) | 2023.10.20 |
[Flutter] Equatable 라이브러리에 대해서 알아보자 (0) | 2023.10.20 |
[Flutter] BLoC - 2. 카운터 앱에 간단하게 적용해보기 (with Cubit) (0) | 2023.10.20 |