시간이 걸리는 작업(API·파일·BLE)을 다루는 법. JS의 Promise/async와 거의 똑같다. (일반 개념)

Future = JS의 Promise

"지금은 없지만 나중에 값이 올 것"을 나타낸다.

Dart JS
Future<T> Promise<T>
async / await async / await (동일)
.then(...) .then(...)
try/catch try/catch
Future<User> fetchUser() async {
  final res = await api.get();   // 기다림
  return User.fromJson(res);
}

Stream = 값이 여러 번 흘러오는 것

Future가 "단 한 번의 결과"라면, Stream은 "계속 흘러오는 값들"이다. BLE 응답, 이벤트, 실시간 구독에 쓴다.

Future Stream
값 개수 1번 여러 번
JS 비유 Promise EventTarget / RxJS Observable
구독 await / then .listen((v) {...})
stream.listen((value) { ... });   // 값이 올 때마다 실행

이 프로젝트의 규칙 (참고)

이 팀은 Repository는 Future를 반환하고, ViewModel은 CompositeSubscription으로 Stream을 관리하는 규칙이 있다(CLAUDE.md). 즉 계층마다 비동기 처리 방식이 정해져 있다.