Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- UI/UX
- JS
- 엡
- println
- react
- Flutter
- DART
- npm
- abap
- java
- unity
- 앱심사
- JQ
- LLM
- java 출력
- scss
- develop
- 자바스크립트
- lifecycle
- nodejs
- firebase
- 배포
- 자바 출력 방식
- riverpod
- printf
- 단축키
- 자바 포맷 출력
- Clean Architecture
- java 콘솔 출력 차이
- ListView
Archives
- Today
- Total
guricode
[Flutter] 비동기 처리하는 여러가지 방법 본문
1) Future / async-await
자주사용하는 대표적인 비동기 처리
한 번 완료되는 비동기 작업(HTTP, 파일 I/O)을 처리한다.
Future<T>가 완료되면 콜백 실행. async/await로 동기처럼 작성.
Future<String> fetch() async {
final res = await http.get(Uri.parse('...')); // await가 다음 줄 일시중단
return res.body;
}
- 에러: try/catch로 처리. 동시 실행은 Future.wait([...]).
2) Stream
여러 값이 시간에 따라 연속 도착(소켓, 이벤트, 센서, 페이지네이션) 할때 사용한다.
구독해 데이터/에러/완료를 받음.
UI 연동: StreamBuilder<T>(stream: ..., builder: ...).
stream.listen()이 Stream의 각 이벤트를 구독하고 처리하는 핵심 메서드다.
| 정의 | Stream의 데이터를 실시간으로 구독(listen) 해서 값, 에러, 완료 상태를 처리 |
| 리턴 값 | StreamSubscription — 언제든지 pause(), resume(), cancel() 가능 |
| 콜백 구조 | (data), onError, onDone 세 가지 콜백 사용 가능 |
final stream = Stream.periodic(
const Duration(seconds: 1),
(count) => '메시지 $count',
).take(5); // 5개까지만 발행
final subscription = stream.listen(
(data) => print('받은 데이터: $data'),
onError: (err) => print('에러: $err'),
onDone: () => print('스트림 종료'),
);
3) Isolate / compute
CPU 무거운 작업을 UI와 분리해 프레임 드랍 방지(이미지 처리, 대용량 파싱)한다.
메모리 분리. 메시지로 통신. 간단히는 compute 사용.
import 'package:flutter/foundation.dart';
int sumTo(int n) { var s = 0; for (var i=0;i<n;i++) s+=i; return s; }
final result = await compute(sumTo, 100000000); // 별도 Isolate에서 계산
4) 이벤트 루프
이벤트 루프는 Dart의 비동기 작업을 순서대로 실행하고 관리하는 메커니즘이다.
쉽게 말하면 작업 큐를 돌면서 해야할 일을 하나씩 처리하는 Dart의 실행 엔진이다.
Dart는 단일 스레드로 동작하는데 여러작업이 동시에 진행되는것처럼 보여도 실제로는 이벤트루프가 순서대로 처리한다.
Isolate
└── Event Loop
├── Microtask Queue (우선 처리)
└── Event Queue (나중 처리)
- 마이크로태스크( 우선순위가 높은 비동기 작업 (예: Future.then, scheduleMicrotask) ) > 이벤트 큐 ( 일반적인 이벤트 (예: IO, Timer, UI 이벤트) )순으로 처리.
- scheduleMicrotask는 바로 다음 tick에, I/O 완료는 이벤트 큐에서.
5) UI 패턴
- 단발성 비동기: FutureBuilder.
FutureBuilder<User>(
future: repo.getUser(),
builder: (_, snap) {
if (!snap.hasData) return const CircularProgressIndicator();
return Text(snap.data!.name);
},
);
- 상태관리와 결합: Riverpod FutureProvider/AsyncNotifier로 로딩·에러 일원화.
- 한 번만 : Future.
- 여러 번 흘러오는 비동기처리: Stream.
- 무거운 CPU 비동기처리: Isolate/compute.
- 네트워크 대기 많음: Future/Stream이면 충분. Isolate 불필요.
'앱 > Flutter&Dart' 카테고리의 다른 글
| [Flutter] 네이티브 코드와 연동하는 방법 (0) | 2025.10.20 |
|---|---|
| [Flutter]AOT와 JIT 컴파일러 (0) | 2025.10.20 |
| [Flutter] Clean Architecture란? (0) | 2025.10.20 |
| [Flutter] Isolate란? (0) | 2025.10.20 |
| [Flutter] 네이티브 기능과 연결하기 위한 패키지 사용 경험 (0) | 2025.10.20 |