민프

[Flutter] stream_transform 라이브러리에 대해서 알아보자 본문

[Flutter]

[Flutter] stream_transform 라이브러리에 대해서 알아보자

민프야 2023. 10. 20. 17:01

먼저 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초에 한번씩 이벤트 고고

참고링크

https://pub.dev/packages/stream_transform

Comments