일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- flutter #dart #stream
- 도약전환
- Flutter #Stream
- 희망적금연계
- 청년도약계좌환승
- 도약계좌전환
- 희망적금전환
- 안드로이드 #코틀린 #코루틴 #콜백 #채널
- 플러터 #안드로이드 #플레이콘솔 #앱내리기
- 도약연계
- Flutter #Stream #dart
- 조립 후 재부팅
- Today
- Total
Flutter 개발 상자
[Flutter Stream⑤] StreamTransformer 스트림을 변형 본문
Map을 통한 Stream의 기초적인 변형
개요
스트림의 변형은 스트림을 사용하다보면 반드시 한번은 겪게되는 문제중 하나이다.
또한 본인이 스트림을 쓰는것을 극도로 꺼려해서 프로젝트에 스트림을 전혀 안쓰더라도 사용하는 라이브러리에서 Stream을 통해서 값을 전달해줄 경우 결국 울면서 스트림을 사용할 수 밖에 없는데 이를 커스텀하기 위해서는 Stream의 변형이 필수적이다.
Bluetooth 라이브러리
사실 내가 스트림을 어쩔 수 없이 붙잡게된 이유중에 하나이다. 플러터는 공식적으로 지원하는 블루투스 라이브러리가 없다. 따라서 메서드 채널로 구현된 서드파티 라이브러리를 쓸 수 밖에 없는데, 그중에 유명한것이
https://pub.dev/packages/flutter_blue_plus
https://pub.dev/packages/flutter_reactive_ble
이렇게 2개의 라이브러리이다.
둘다 아직까지 관리가 잘 되고 있는 라이브러리라 어떤걸 써도 크게 문제가 없지만 중요한건 둘다 Stream을 통해서 기기를 스캔하고 정보를 받는다는 점이다.
나는 여기서 flutter_blue_plus 라이브러리를 사용해보면서 스트림의 변형을 구현해보려고 한다.
blue_plus 라이브러리 map으로 변형해보기
class BluetoothUtil {
StreamSubscription<List<String>> startScanDeviceName({
required Function(List<String> deviceName) onData,
}) {
// 주변 기기 스캔을 하는 스트림
final Stream<List<ScanResult>> scanStream = FlutterBluePlus.scanResults;
// map 을 통해서 변형
final Stream<List<String>> newStream = scanStream.map((event) {
return event.map((e) => e.device.platformName).toList();
});
return newStream.listen(onData);
}
}
일단 사용을 위해 당연히 pubspec.yaml에 의존성 추가를 해주고
블루투스 유틸이라는 별도의 클래스를 만들고 FlutterBluePlus의 Stream을 변형해보았다.
원래는 ScanResult라는 주변 기기 정보 클래스가 들어오게 되어있는데
여기서는 바로 기기의 이름을 받아오도록 map으로 변형해보았다.
StreamTransformer을 통한 변형
fromHandlers
Stream<List<String>> startScanDeviceName2() {
// 주변 기기 스캔을 하는 스트림
final Stream<List<ScanResult>> scanStream = FlutterBluePlus.scanResults;
// StreamTransformer 를 통해서 변형
final customTransformer = StreamTransformer<List<ScanResult>, List<String>>.fromHandlers(
handleData: (data, sink) {
sink.add(data.map((e) => e.device.platformName).toList());
},
);
return scanStream.transform(customTransformer);
}
동일한 변형 과정을 StreamTransformer로 변형해보았다.
이정도의 변환과정은 확실히 map을 쓰는게 좀 더 직관적이고 간편한 것 같다.
'Flutter' 카테고리의 다른 글
[Flutter] Riverpod의 Provider에서 BuildContext를 매개변수로 받으면 안되는가? (1) | 2024.01.22 |
---|---|
[Flutter] 현 시점 GetX를 쓰지 말아야 하는 이유 (2) | 2024.01.05 |
[Flutter] Riverpod의 Provider(Notifier) 영역에서 context나 TextEditingController를 써도 되는가? (2) | 2024.01.01 |
[Flutter] Talker 패키지를 이용하여 로그(Log)를 파일로 저장하기 (0) | 2023.12.21 |
[Flutter Stream④] StreamController 활용 (2) | 2023.11.12 |